Создает ли ленивый модуль дочерний инжектор корневого инжектора
Предположим, у меня есть следующее LazyModule
это лениво загружено и LazyComponent
объявлено внутри:
@NgModule({
declarations: [LazyComponent],
providers: [LazyModuleService],
})
export class LazyModule { ...
@Component({
selector: 'my-lazy',
providers: [LazyComponentService]
})
export class LazyComponent { ...
Насколько я понимаю, что при загрузке LazyModule
угловой создаст дочерний инжектор для этого модуля из rootInjector
, что-то вроде этого:
var lazyModuleInjector = rootInjector.resolveAndCreateChild([LazyModuleService]);
а затем создать детский инжектор для LazyComponent
как это:
var lazyModuleInjector = lazyModuleInjector.resolveAndCreateChild([LazyComponentService]);
Так что в конечном итоге дерево инжекторов будет таким:
Это правильно?
1 ответ
Да, это правильно. Это не было сделано преднамеренно, но потому что инжектор только для чтения после того, как это было создано. Поскольку лениво загруженные модули загружаются позже, его провайдеры не могут быть добавлены к корневому провайдеру приложения, потому что этот уже запечатан. Вот почему они представили новую корневую область для лениво загруженных модулей.
Если вам нужны глобальные провайдеры (синглтоны) провайдеров, предоставляемых лениво загруженными модулями, внедри forRoot()
в ленивом загруженном модуле и предоставьте глобальных провайдеров там, а затем импортируйте только провайдеров в корневую область приложения с imports: [LazyModule.forRoot()]
,