假设我有以下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]);
所以最终注入器树是这样的:
这是对的吗?
答案 0 :(得分:5)
是的,这是正确的。这不是故意的,但因为注射器在创建之后是只读的。 由于延迟加载的模块稍后加载,因此无法将其提供程序添加到应用程序根提供程序,因为此提供程序已经密封。 这就是为什么他们为延迟加载的模块引入了一个新的根作用域。
如果您想要由延迟加载的模块提供的提供程序的全局提供程序(单例),请在延迟加载的模块中实现forRoot()
并在那里提供全局提供程序,然后仅使用{将提供程序导入应用程序根范围{1}}。