4

假设我有以下内容LazyModule被延迟加载并在其中LazyComponent声明:

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


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

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

var lazyModuleInjector = rootInjector.resolveAndCreateChild([LazyModuleService]);

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

var lazyModuleInjector = lazyModuleInjector.resolveAndCreateChild([LazyComponentService]);

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

在此处输入图像描述

这是对的吗?

4

1 回答 1

5

是的,这是正确的。这不是故意的,而是因为注入器在创建后是只读的。因为延迟加载的模块是稍后加载的,所以它的提供者不能被添加到应用程序根提供者中,因为这个已经被密封了。这就是为什么他们为延迟加载的模块引入了一个新的根范围。

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

于 2017-02-16T18:08:14.387 回答