【发布时间】: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 将从根注入器获取它
-
立即获取。如果他们不意味着它一直发生,我很困惑 - 无论子(延迟加载)注入器中是否有提供者。