entryComponent是通过力加载角度的组件,这意味着HTML模板中未引用这些组件。在大多数情况下,当在组件模板中明确声明组件时,Angular会加载组件。但是entryComponents并非如此。 entryComponents仅动态加载,并且从未在组件模板中引用。它引用HTML中找不到的组件数组,而是由ComponentFactoryResolver添加。
首先,Angular通过ComponentFactoryResolver类为每个bootstrap entryComponents创建一个组件工厂,然后在运行时使用工厂实例化组件。
abstract class ComponentFactoryResolver {
static NULL: ComponentFactoryResolver
abstract resolveComponentFactory(component: Type): ComponentFactory
}
Angular中输入组件的类型:
- 自举根组件
- 路由组件(您在路由中指定的组件)
Bootstrapped entryComponent:在应用程序启动时或引导过程中,引导组件由Angular加载到DOM(文档对象模型)中。
import { BrowserModule } from '@angular/platform-browser';
import { NgModule } from '@angular/core';
import { AppComponent } from './app.component';
@NgModule({
declarations: [
AppComponent
],
imports: [
BrowserModule
],
providers: [],
bootstrap: [AppComponent]
})
export class AppModule { }
引导程序组件是一个entryComponent,它提供应用程序的入口点。默认情况下,Angular加载AppComponent,因为它在@ NgModule.bootstrap中列出。
Routed entryComponent:此类组件被声明为组件,并作为数组添加到应用程序的声明部分中。但是,您可能需要按组件的类来引用该组件。路由器组件未在组件的HTML中明确指定,但已在routes数组中注册。这些组件也会动态加载,因此Angular需要了解它们。
这些组件添加在两个位置:
- 路由器
- entryComponents
app-routing.module.ts
import { NgModule } from '@angular/core';
import { RouterModule, Routes } from '@angular/router';
import { ListComponent } from './list/list.component';
import { DetailComponent } from './detail/detail.component';
const routes: Routes = [
{
path:'',
redirectTo:'/contact',
pathMatch:'full'
},
{
path: 'list',
component: ListComponent
},
{
path: 'detail',
component: DetailComponent
},
{
path:'**',
redirectTo:'/not-found'
}
];
@NgModule({
imports:[RouterModule.forRoot(routes)],
exports:[RouterModule]
})
export class AppRoutingModule{
}
您不需要将组件显式添加到entryComponent数组中,Angular会自动执行。编译器将所有路由器组件添加到entryComponent数组。
需要entryComponent Array: Angular仅包含模板中已引用的最终捆绑包中的那些组件。这样做是为了通过不包括不需要的组件来减小最终包装的尺寸。但这将破坏最终应用程序,因为所有entryComponents都不会包含在最终包中(因为它们从未被引用过)。因此,我们需要在Angular的entyComponents数组下注册这些组件,以将它们包括在包中。