📜  angular ngModule中的entryComponents是什么?

📅  最后修改于: 2021-05-13 20:26:21             🧑  作者: Mango

entryComponent是通过力加载角度的组件,这意味着HTML模板中未引用这些组件。在大多数情况下,当在组件模板中明确声明组件时,Angular会加载组件。但是entryComponents并非如此。 entryComponents仅动态加载,并且从未在组件模板中引用。它引用HTML中找不到的组件数组,而是由ComponentFactoryResolver添加。

首先,Angular通过ComponentFactoryResolver类为每个bootstrap entryComponents创建一个组件工厂,然后在运行时使用工厂实例化组件。

abstract class ComponentFactoryResolver {
  static NULL: ComponentFactoryResolver
  abstract resolveComponentFactory(component: Type): ComponentFactory
}

Angular中输入组件的类型:

  1. 自举根组件
  2. 路由组件(您在路由中指定的组件)

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中列出。

app.module.ts

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数组下注册这些组件,以将它们包括在包中。