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

Max*_*kyi 3 angular2-di angular

假设我有以下LazyModule是懒惰加载并在其中LazyComponent声明的内容:

@NgModule({
    declarations: [LazyComponent],
    providers: [LazyModuleService],
})
export class LazyModule { ...


@Component({
    selector: 'my-lazy',
    providers: [LazyComponentService]
})
export class LazyComponent { ...
Run Code Online (Sandbox Code Playgroud)

我的理解是,当加载LazyModuleangular时会为这个模块创建一个子注入器rootInjector,如下所示:

var lazyModuleInjector = rootInjector.resolveAndCreateChild([LazyModuleService]);
Run Code Online (Sandbox Code Playgroud)

然后创建一个这样的子注入器LazyComponent:

var lazyModuleInjector = lazyModuleInjector.resolveAndCreateChild([LazyComponentService]);
Run Code Online (Sandbox Code Playgroud)

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

在此输入图像描述

这是对的吗?

Gün*_*uer 5

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

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

  • 因为他们是急切地添加的,而不是懒惰的。 (2认同)