【问题标题】:Does Angular component from lazy loaded module gets copy of the global service?延迟加载模块中的 Angular 组件是否获取全局服务的副本?
【发布时间】:2018-07-05 17:20:49
【问题描述】:

我不确定我是否理解 Angular 文档

Angular providers documentation 状态:

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

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

问题

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

假设我有两种情况:

情况A

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

情况乙

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

在情况 A 中,SubpageComponent 中的 ProviderX 实例与 AppComponent 中的实例相同还是不同?我知道在情况 B 他们不是。

【问题讨论】:

  • 应该是同一个实例。如果它不应该提供复制
  • @yurzui “在延迟加载模块的上下文中创建的任何组件,例如通过路由器导航,获取服务的本地实例,而不是根应用程序注入器中的实例。”是什么意思?你认为这是一个错误吗?
  • 这意味着有两个提供者:在根和惰性上下文中。如果我们试图访问这个提供者,那么 Angular 更喜欢从惰性提供者创建的服务实例,而不是应用程序根注入器的服务实例。
  • 如果我们没有在惰性上下文中提供任何服务,那么 Angular 将从根注入器获取它
  • 立即获取。如果他们不意味着它一直发生,我很困惑 - 无论子(延迟加载)注入器中是否有提供者。

标签: angular angular-providers


【解决方案1】:

情况A

AppComponent 和 SubpageComponent 获得相同的实例注入

情况乙

AppComponent 和 SubpageComponent 获得不同的实例注入

通过您的设置,您将获得类似的注入器层次结构

- AppModule
 |- AppComponent
 |- SubPageModule
   |- SubpageComponent

Angular 从需要向树结构中注入值的位置向上搜索,直到找到第一个匹配的提供者。然后注入第一个找到的提供者提供的实例。

【讨论】:

  • 我就是这么想的。只是这段文档摘录让我感到困惑。
  • “获取服务的本地实例”为真,但前提是存在本地提供者。另请参阅我的更新答案。
猜你喜欢
  • 2018-06-19
  • 2018-04-10
  • 2017-06-21
  • 2020-10-16
  • 2017-02-22
  • 1970-01-01
  • 2018-05-16
  • 2020-01-24
  • 2021-07-13
相关资源
最近更新 更多