Почему Angular требует от нас объявлять динамические компоненты в массиве объявлений и массиве entryComponents? - PullRequest
0 голосов
/ 15 октября 2018

Я реализовывал динамические компоненты для одного из моих проектов.Концепция динамических компонентов заключается в том, что они входят в память, когда они необходимы, и не имеют ссылок ни на один шаблон.

В соответствии с официальным документами мы объявляем такие компоненты в 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 Я получаю следующую ошибку:

enter image description here

Вышеуказанная ошибка исчезает, как только я добавляю оба моих динамических компонента в массив declarations.В вышеупомянутых официальных документах также говорится, что нам не нужно объявлять компоненты, которые доступны из компонента entryComponents или bootstrap.Я также посетил этот ответ, но он кажется недостаточно удовлетворительным, поскольку он относится к Ionic.

Пожалуйста, помогите мне узнать, где мне не хватает этого.Заранее спасибо!:)

1 Ответ

0 голосов
/ 15 октября 2018

Как видно из этой цитаты (при чтении между строк ):

Хотя в декораторе @NgModule есть массив entryComponents, большую часть времени у вас не будетдля явной установки любых компонентов ввода, поскольку Angular добавляет компоненты, перечисленные в @ NgModule.bootstrap, и те, которые указаны в определениях маршрута, к компонентам ввода автоматически.

Вы добавляете обычные компоненты в массив EntryComponents неявно ,это означает, что они добавляются в оба массива - Объявления и EntryComponents (в то время как вы добавили его только в массиве объявлений).Таким образом, вы должны добавить динамические компоненты явно также к обоим массивам.

Объявления цель состоит в том, чтобы сделать директиву (компонент и т. Д.) Доступной для других классов в вашем модуле и сопоставить ее селектор с HTML.

EntryComponents говорит Angular создать componentFactory, который создается компилятором из метаданных, которые вы предоставляете в @Component декораторе, так что вы позже можете использовать его в createComponent().

Как видно, эти два массива служат оченьразные цели, и оба необходимы для создания компонента.Если компонент не создается динамически, компилятор считывает его метаданные и создает componentFactory, но компилятор не знает о динамических компонентах, поэтому вы должны сообщить ему о динамических компонентах до его запуска, поскольку он запускается только один раз - во время компиляции:)

...