延迟加载是否在Angular中创建了新的Injector?

时间:2018-10-04 04:14:42

标签: angular dependency-injection

阅读Angular的官方文档

  

当Angular路由器延迟加载模块时,它将创建一个新的注入器。该注入器是根应用注入器的子代。路由器将所有提供程序从根注入器添加到子注入器。当路由器在延迟加载的上下文中创建组件时,Angular会优先考虑从这些提供者创建的服务实例,而不是应用程序根注入器的服务实例。

基于此,我创建了一个小型应用程序,该应用程序在其根组件中提供了一项服务。该服务具有绑定到延迟加载的组件和热切加载的组件的属性。我期望的是,热切加载的组件应该使用旧注射器的服务实例。因此,急切加载的组件对服务属性的任何更改都不应反映在延迟加载的组件中。延迟加载的组件应使用子注入器中的新服务实例。 但这不会发生。有人可以解释吗?

Here is the link to stackblitz.

1 个答案:

答案 0 :(得分:3)

  • 是否是在Angular中延迟加载创建了新的Injector?

对。

对于每个延迟加载的模块,angular都会创建从父注射器继承的注射器。

但这并不意味着此继承的注入器将为父注入中提供的每个服务创建新实例。除非您未在延迟加载的模块中提供此服务。否则,Angular将遍历树以找到提供的服务,并将在父注射器上找到它。

因此只需将您的服务添加到LazyModule providers数组中,它将在LazyModule注入器中注册,这样LazyComponent将从延迟加载的注入器获取实例。

@NgModule({
  imports: [
    CommonModule,
    LazyRoutingModule
  ],
  providers: [AppService],     <=================
  declarations: [LazyComponent]
})
export class LazyModule { }

我还建议您阅读这篇文章

更新

来自评论:

  

所以在延迟加载的情况下,我们不应该有类似的行为吗?   来自文件路由器从根注入器添加所有提供程序   到儿童注射器。

我相信只有代码。

当angular创建延迟加载的注入器(NgModuleRef)时,它仅将引用传递给父注入器(NgModuleRef)。

enter image description here

当解析AppService依赖关系时,它首先查看子注入器,然后查看父注入器,因为子注入器中没有注册的AppService

enter image description here