首页 文章

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

提问于
浏览
0

Angular docs我不确定我是否理解

Angular providers documentation陈述:

当Angular路由器延迟加载模块时,它会创建一个新的注入器 . 此注入器是根应用程序注入器的子代 . 想象一下注射器树;有一个根注入器,然后是每个延迟加载模块的子注入器 . 路由器将根注入器中的所有提供程序添加到子注入器 . 当路由器在延迟加载的上下文中创建组件时,Angular将从这些提供程序创建的服务实例更喜欢应用程序根注入器的服务实例 . 在延迟加载的模块的上下文中创建的任何组件(例如通过路由器导航)获取服务的本地实例,而不是根应用程序注入器中的实例 . 外部模块中的组件继续接收为应用程序根创建的实例 .

问题

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

假设我有两种情况:

情况A.

  • 根模块 AppModule

  • 提供 ProviderX

  • 宣布 AppComponent

  • 注入 ProviderX

  • 延迟加载模块 SubpageModule

  • no providers

  • 声明 SubpageComponent

  • 注入 ProviderX

情况B.

  • 根模块 AppModule

  • 提供 ProviderX

  • 宣布 AppComponent

  • 注入 ProviderX

  • 延迟加载模块 SubpageModule

  • provides ProviderX

  • 宣布 SubpageComponent

  • 注入 ProviderX

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

1 回答

  • 3

    情况A.

    AppComponent和SubpageComponent获取 same instance 注入

    情况B.

    注入AppComponent和SubpageComponent different instances

    使用您的设置,您将获得一个注入器层次结构

    - AppModule
     |- AppComponent
     |- SubPageModule
       |- SubpageComponent
    

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

相关问题