为什么Angular要求我们在声明数组和entryComponents数组中声明动态组件?

时间:2018-10-15 04:42:13

标签: javascript angular angular-dynamic-components

我正在为我的一个项目实现动态组件。动态组件的概念是,它们在需要时就会进入内存,并且在任何模板中都没有引用。

根据官方docs,我们在entryComponents中声明了此类组件,以防止它们在摇树过程中被丢弃,因为它们没有模板引用。

下面是app.module.ts,在其中我在SlideOneComponent数组中声明了两个动态分量SlideTwoComponententryComponents

  @NgModule({
  declarations: [
    AppComponent,
    ButtonComponent,
    AdDirective
  ],
  imports: [
    BrowserModule
  ],
  providers: [],
  entryComponents: [
      SlideOneComponent,
      SlideTwoComponent,
  ],
  bootstrap: [AppComponent]
})
export class AppModule { }

app.module.ts以上,我得到以下错误:

enter image description here

将两个动态组件添加到declarations数组后,上述错误就消失了。前述官方文档还说,我们不需要声明entryComponentsbootstrap组件可以访问的组件。我也访问了this答案,但这似乎还不够令人满意,因为它涉及到Ionic。

请帮助我知道我在哪里想念。提前致谢! :)

1 个答案:

答案 0 :(得分:1)

如该引用所示(在两行之间阅读 时):

  

尽管@NgModule装饰器具有entryComponents数组,但大多数   您无需显式设置任何输入组件的时间,因为   Angular添加@ NgModule.bootstrap中列出的组件以及   将定义自动路由到入口组件。

您将普通组件隐式地添加到EntryComponents数组中,这意味着它们将同时添加到两个数组中-声明和EntryComponents(而仅将其添加到声明数组中)。因此,您还必须显式向两个阵列中添加动态组件。

声明的目的是使指令(组件等)可用于模块中的其他类,并将其选择器与HTML匹配。

EntryComponents 告诉Angular创建一个componentFactory,它是由编译器根据您在@Component装饰器中提供的元数据创建的,因此您以后可以在createComponent()中使用它

如所见,这两个数组用于非常不同的目的,并且都需要两个数组才能创建组件。如果不是动态创建组件,则编译器会读取它的元数据并创建一个componentFactory,但是编译器不了解动态组件,因此您必须在动态组件运行之前通知它动态组件,因为动态组件只能运行一次-在编译时:)