我正在为我的一个项目实现动态组件。动态组件的概念是,它们在需要时就会进入内存,并且在任何模板中都没有引用。
根据官方docs,我们在entryComponents
中声明了此类组件,以防止它们在摇树过程中被丢弃,因为它们没有模板引用。
下面是app.module.ts
,在其中我在SlideOneComponent
数组中声明了两个动态分量SlideTwoComponent
和entryComponents
:
@NgModule({
declarations: [
AppComponent,
ButtonComponent,
AdDirective
],
imports: [
BrowserModule
],
providers: [],
entryComponents: [
SlideOneComponent,
SlideTwoComponent,
],
bootstrap: [AppComponent]
})
export class AppModule { }
在app.module.ts
以上,我得到以下错误:
将两个动态组件添加到declarations
数组后,上述错误就消失了。前述官方文档还说,我们不需要声明entryComponents
或bootstrap
组件可以访问的组件。我也访问了this答案,但这似乎还不够令人满意,因为它涉及到Ionic。
请帮助我知道我在哪里想念。提前致谢! :)
答案 0 :(得分:1)
如该引用所示(在两行之间阅读 时):
尽管@NgModule装饰器具有entryComponents数组,但大多数 您无需显式设置任何输入组件的时间,因为 Angular添加@ NgModule.bootstrap中列出的组件以及 将定义自动路由到入口组件。
您将普通组件隐式地添加到EntryComponents数组中,这意味着它们将同时添加到两个数组中-声明和EntryComponents(而仅将其添加到声明数组中)。因此,您还必须显式向两个阵列中添加动态组件。
声明的目的是使指令(组件等)可用于模块中的其他类,并将其选择器与HTML匹配。
EntryComponents 告诉Angular创建一个componentFactory,它是由编译器根据您在@Component
装饰器中提供的元数据创建的,因此您以后可以在createComponent()
中使用它
如所见,这两个数组用于非常不同的目的,并且都需要两个数组才能创建组件。如果不是动态创建组件,则编译器会读取它的元数据并创建一个componentFactory,但是编译器不了解动态组件,因此您必须在动态组件运行之前通知它动态组件,因为动态组件只能运行一次-在编译时:)>