2016-09-28 44 views
87

我正在使用Ionic应用程序(2.0.0-rc0),这取决于angular 2。所以包括了ngModules的新介绍。我在下面添加我的app.module.ts.angular ngModule中的entryComponents是什么?

import { NgModule } from '@angular/core'; 
import { IonicApp, IonicModule } from 'ionic-angular'; 
import { MyApp } from './app.component'; 
import { Users } from '../pages/users/users'; 

@NgModule({ 
    declarations: [ 
    MyApp, 
    Users 
    ], 
    imports: [ 
    IonicModule.forRoot(MyApp) 
    ], 
    bootstrap: [IonicApp], 
    entryComponents: [ 
    MyApp, 
    Users 
    ] 
}) 
export class AppModule {} 

是什么entryComponents在这里做? Components已在declarations中定义。那么有什么需要重复它们呢?如果我不在这里包含组件,会发生什么?

+4

Angular使用entryComponents来启用“树震动”,即只编译项目中实际使用的组件,而不是编译所有在'ngModule'中声明的组件,但从不使用。 https://angular.io/docs/ts/latest/cookbook/ngmodule-faq.html#!#why-does-angular-need-_entrycomponents_- – Samar

回答

100

这是用于动态添加的组件,使用ViewContainerRef.createComponent()添加。将它们添加到entryComponents会告诉脱机模板编译器编译它们并为它们创建工厂。

在路由配置中注册的组件也会自动添加到entryComponents,因为router-outlet也使用ViewContainerRef.createComponent()将路由组件添加到DOM。

离线模板编译器(OTC)仅构建实际使用的组件。如果组件未直接用于模板,则OTC无法知道它们是否需要编译。使用entryComponents,您可以告诉OTC也编译这些组件,以便它们在运行时可用。

What is an entry component? (angular.io)

NgModule docs (angular.io)

定义应在此分量被定义时,以及编译的组件。对于此处列出的每个组件,Angular将创建一个ComponentFactory并将其存储在ComponentFactoryResolver中。

如果您未列出动态添加组件到entryComponents,您将收到一条错误消息,因为Angular没有创建一个。

https://angular.io/docs/ts/latest/cookbook/dynamic-component-loader.html

+6

坦率地说,我知道它100%正确的答案,但为我保留了保镖,请你详细说明一下吗? –

+20

很难说什么不清楚。离线模板编译器(OTC)仅构建实际使用的组件。如果组件未直接用于模板,则OTC无法知道它们是否需要编译。通过'entryComponents',你可以告诉OTC编译这些组件,以便它们在运行时可用。 –

+0

感谢Gunter。你可以给我一个场景,在entryComponents中不添加组件会导致一些问题吗? – raj

19

看你会不会得到解释比角文档更好。

以下是角度文档的解释。

入口组件是按角色强制性地加载角度的任何组件。

通过其选择器声明式加载的组件不是条目组件。

大多数应用程序组件是声明式加载的。 Angular使用组件的选择器来定位模板中的元素。然后它创建该组件的HTML表示并将其插入选定元素的DOM中。这些不是条目组件。

一些组件只能动态加载,并且从未在组件模板中引用。

引导根AppComponent是一个入口组件。确实,它的选择器匹配index.html中的元素标记。但是index.html不是组件模板,并且AppComponent选择器不匹配任何组件模板中的元素。

动态加载AppComponent,因为它按照@NgModule.bootstrap中的类型列出,或者通过模块的ngDoBootstrap方法强制性地加载。

路由定义中的组件也是条目组件。路径定义是指按其类型的组件。路由器会忽略路由组件的选择器(如果它有一个)并将该组件动态加载到RouterOutlet

编译器无法通过在其他组件模板中查找它们来发现这些条目组件。您必须将它们添加到entryComponents列表中来告诉它们。

角自动添加下列类型的组件模块的entryComponents

  • @NgModule.bootstrap列表中的组件。
  • 路由器配置中引用的组件。

您不必明确提及这些组件,尽管这样做是无害的。

+0

现在角度文档不可用,所以非常感谢! – Caelum