延迟模块是否创建根注入器的子注入器

时间:2017-02-16 18:04:09

标签: angular angular2-di

假设我有以下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]);

所以最终注入器树是这样的:

enter image description here

这是对的吗?

1 个答案:

答案 0 :(得分:5)

是的,这是正确的。这不是故意的,但因为注射器在创建之后是只读的。 由于延迟加载的模块稍后加载,因此无法将其提供程序添加到应用程序根提供程序,因为此提供程序已经密封。 这就是为什么他们为延迟加载的模块引入了一个新的根作用域。

如果您想要由延迟加载的模块提供的提供程序的全局提供程序(单例),请在延迟加载的模块中实现forRoot()并在那里提供全局提供程序,然后仅使用{将提供程序导入应用程序根范围{1}}。