3

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

Angular提供者文档指出:

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

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

问题

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

假设我有两种情况:

情况A

  • 根模块AppModule
    • 提供ProviderX
    • 宣布AppComponent
      • 注入ProviderX
  • 懒加载模块SubpageModule
    • 没有提供者
    • 宣布SubpageComponent
      • 注入ProviderX

情况乙

  • 根模块AppModule
    • 提供ProviderX
    • 宣布AppComponent
      • 注入ProviderX
  • 懒加载模块SubpageModule
    • 提供ProviderX
    • 宣布SubpageComponent
      • 注入ProviderX

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

4

1 回答 1

6

情况A

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

情况乙

AppComponent 和 SubpageComponent注入不同的实例

通过您的设置,您将获得一个注入器层次结构,例如

- AppModule
 |- AppComponent
 |- SubPageModule
   |- SubpageComponent

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

于 2018-01-26T11:14:34.547 回答