延迟加载模块的Angular组件是否获得全局服务的副本?

时间:2018-01-26 11:08:47

标签: angular angular-providers

Angular docs我不确定我是否理解

Angular providers documentation州:

  

当Angular路由器延迟加载模块时,它会创建一个新模块   注射器。此注入器是根应用程序注入器的子代。   想象一下注射器树;然后有一个单根注射器   每个延迟加载模块的子注入器。路由器添加了所有   从根注入器到子注入器的提供者。当。。。的时候   路由器在延迟加载的上下文Angular中创建一个组件   优先考虑从这些提供程序创建的服务实例到服务   应用程序根注入器的实例。

     

在延迟加载的模块的上下文中创建的任何组件,例如   通过路由器导航,获取服务的本地实例,而不是   根应用程序注入器中的实例。外部组件   模块继续接收为应用程序创建的实例   根

问题

这是否意味着当我在延迟加载的模块中访问任何全局声明的提供程序时,我访问它的副本,该副本与根注入器中创建的实例是分开的?

假设我有两种情况:

情况A

  • 根模块AppModule
    • 提供ProviderX
    • 声明AppComponent
      • 注入ProviderX
  • 延迟加载模块SubpageModule
    • 没有提供商
    • 声明SubpageComponent
      • 注入ProviderX

情况B

  • 根模块AppModule
    • 提供ProviderX
    • 声明AppComponent
      • 注入ProviderX
  • 延迟加载模块SubpageModule
    • 提供ProviderX
    • 声明SubpageComponent
      • 注入ProviderX

在情况A中,ProviderXSubpageComponent的实例是与AppComponent中的实例相同还是不同的实例?我理解情况B他们不是。

1 个答案:

答案 0 :(得分:4)

情况A

AppComponent和SubpageComponent获得相同实例注入

情况B

AppComponent和SubpageComponent获得不同实例注入

使用您的设置,您将获得类似

的注入器层次结构
- AppModule
 |- AppComponent
 |- SubPageModule
   |- SubpageComponent

从需要向树结构注入值的位置进行角度搜索,直到找到第一个匹配的提供程序。然后它注入第一个找到的提供者提供的实例。