Ленивая загрузка создает новый Инжектор в Angular? - PullRequest
0 голосов
/ 04 октября 2018

Чтение официальной документации Angular

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

На основе этого я создал небольшое приложение, которое имеетодин сервис, который предоставляется в корневом компоненте приложения.У этого сервиса есть свойство, которое привязано как к лениво загруженному компоненту, так и к загруженному компоненту.Я ожидаю, что загруженный компонент должен использовать экземпляр службы из старого инжектора.Следовательно, любые изменения в свойстве сервиса загруженным компонентом не должны отражаться в загруженном компоненте.Ленивый загруженный компонент должен использовать новый экземпляр службы из дочернего инжектора.Но этого не происходит.Может кто-нибудь объяснить?

Вот ссылка на stackblitz.

1 Ответ

0 голосов
/ 04 октября 2018
  • Создает ли Ленивая загрузка новый Injector в Angular?

Right.

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

Но это не означает, что этот унаследованный инжектор будет создавать новый экземпляр для каждой службы, предоставляемой в родительском инжекте , если вы не предоставите эту услугу в загруженном модуле * 1014.*.В противном случае Angular перейдет к дереву, чтобы найти предоставленную услугу, и найдет его на родительском инжекторе.

Так что просто добавьте свой сервис в массив LazyModule providers, и он будет зарегистрирован в LazyModule, и таким образом LazyComponent будет получать экземпляр из загруженного инжектора.

@NgModule({
  imports: [
    CommonModule,
    LazyRoutingModule
  ],
  providers: [AppService],     <=================
  declarations: [LazyComponent]
})
export class LazyModule { }

Я также предлагаю вамчитая эту статью

Обновление

Из комментария:

Так что не должно быть такого поведения в случае отложенной загрузки, как из документа.Маршрутизатор добавляет всех провайдеров от корневого инжектора к дочернему инжектору.

Я верю только коду.

Когда угловое создает инжектор с отложенной загрузкой (NgModuleRef) он передает только ссылку на родительский инжектор (NgModuleRef).

enter image description here

И когда он разрешает зависимость AppService, он сначала смотрит на дочерний инжектор, а затем на родителя, потому что в дочернем инжекторе нет зарегистрированного AppService

enter image description here

...