惰性模块是否创建根注入器的子注入器
Does lazy module create child injector of a root injector
假设我有以下延迟加载的 LazyModule
和在其中声明的 LazyComponent
:
@NgModule({
declarations: [LazyComponent],
providers: [LazyModuleService],
})
export class LazyModule { ...
@Component({
selector: 'my-lazy',
providers: [LazyComponentService]
})
export class LazyComponent { ...
我的理解是加载 LazyModule
时 angular 将从 rootInjector
为该模块创建一个子注入器,如下所示:
var lazyModuleInjector = rootInjector.resolveAndCreateChild([LazyModuleService]);
然后像这样为 LazyComponent
创建子注入器:
var lazyModuleInjector = lazyModuleInjector.resolveAndCreateChild([LazyComponentService]);
所以最终注入器树是这样的:
是否正确?
是的,这是正确的。这不是故意的,而是因为注入器在创建后是只读的。
因为懒加载的模块是后加载的,所以它的提供者不能添加到应用程序根提供者中,因为这个已经被密封了。
这就是为什么他们为延迟加载模块引入了一个新的根作用域。
如果你想要延迟加载模块提供的提供者的全局提供者(单例),在延迟加载模块中实现 forRoot()
并在那里提供全局提供者,然后只将提供者导入应用程序根范围imports: [LazyModule.forRoot()]
.
假设我有以下延迟加载的 LazyModule
和在其中声明的 LazyComponent
:
@NgModule({
declarations: [LazyComponent],
providers: [LazyModuleService],
})
export class LazyModule { ...
@Component({
selector: 'my-lazy',
providers: [LazyComponentService]
})
export class LazyComponent { ...
我的理解是加载 LazyModule
时 angular 将从 rootInjector
为该模块创建一个子注入器,如下所示:
var lazyModuleInjector = rootInjector.resolveAndCreateChild([LazyModuleService]);
然后像这样为 LazyComponent
创建子注入器:
var lazyModuleInjector = lazyModuleInjector.resolveAndCreateChild([LazyComponentService]);
所以最终注入器树是这样的:
是否正确?
是的,这是正确的。这不是故意的,而是因为注入器在创建后是只读的。 因为懒加载的模块是后加载的,所以它的提供者不能添加到应用程序根提供者中,因为这个已经被密封了。 这就是为什么他们为延迟加载模块引入了一个新的根作用域。
如果你想要延迟加载模块提供的提供者的全局提供者(单例),在延迟加载模块中实现 forRoot()
并在那里提供全局提供者,然后只将提供者导入应用程序根范围imports: [LazyModule.forRoot()]
.