2016-09-28 4 views
87

Я работаю над приложением Ionic (2.0.0-rc0), которое зависит от angular 2. Таким образом, введено новое введение ngModules. Я добавляю свой app.module.ts. ниже.Что такое entryComponents в угловом модуле ngModule?

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

Угловые использует 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 вы получите сообщение об ошибке бою пропавшего завод, потому что Угловые не будет созданы.

Смотрите также https://angular.io/docs/ts/latest/cookbook/dynamic-component-loader.html

+6

, честно говоря, я знаю его 100% правильный ответ, но пошел вышибала для меня , не могли бы вы рассказать подробнее? –

+20

Трудно сказать, что неясно. Автономный компилятор (OTC) создает только те компоненты, которые фактически используются. Если компоненты не используются в шаблонах напрямую, OTC не может знать, нужно ли их компилировать. С помощью 'entryComponents' вы можете сообщить OTC также скомпилировать эти компоненты, чтобы они были доступны во время выполнения. –

+0

Спасибо Гюнтер. Можете ли вы дать мне сценарий, в котором не добавление компонентов в '' entryComponents' 'вызовет некоторую проблему? – raj

19

Вы не получите объяснение лучше, чем Угловые документы.

И ниже объяснение из угловых документов.

Элемент ввода - это любой компонент, который имеет угловую нагрузку по типу.

Компонент, загружаемый декларативно через его селектор, не является компонентом записи.

Большинство компонентов приложения загружаются декларативно. Угловой использует селектор компонента, чтобы найти элемент в шаблоне. Затем он создает представление HTML компонента и вставляет его в DOM в выбранном элементе. Это не входящие компоненты.

Несколько компонентов загружаются только динамически и никогда не упоминаются в шаблоне компонента.

Загрузочный корень AppComponent является компонентом записи. Правда, его селектор соответствует тегу элемента в index.html. Но index.html не является шаблоном компонента, а селектор AppComponent не соответствует элементу в любом шаблоне компонента.

Угловые нагрузки AppComponent динамически, потому что они либо перечислены по типу @NgModule.bootstrap, либо принудительно форматируются с помощью модуля ngDoBootstrap.

Компоненты определения маршрута также являются компонентами входа. Определение маршрута относится к компоненту по типу. Маршрутизатор игнорирует селектор маршрутизируемого компонента (если он даже имеет один) и динамически загружает компонент в RouterOutlet.

Компилятор не может обнаружить эти элементы входа, ища их в других шаблонах компонентов. Вы должны рассказать об этом, добавив их в список entryComponents.

Угловая автоматически добавляет следующие типы компонентов модуля entryComponents:

  • компонент в @NgModule.bootstrap списке.
  • Компоненты, указанные в конфигурации маршрутизатора.

Вы не должны упоминать эти компоненты явно, хотя это безвредно.

+0

Прямо сейчас угловые документы недоступны, так что спасибо за это! – Caelum

Смежные вопросы