Angular providers documentation州:
当Angular路由器延迟加载模块时,它会创建一个新模块 注射器。此注入器是根应用程序注入器的子代。 想象一下注射器树;然后有一个单根注射器 每个延迟加载模块的子注入器。路由器添加了所有 从根注入器到子注入器的提供者。当。。。的时候 路由器在延迟加载的上下文Angular中创建一个组件 优先考虑从这些提供程序创建的服务实例到服务 应用程序根注入器的实例。
在延迟加载的模块的上下文中创建的任何组件,例如 通过路由器导航,获取服务的本地实例,而不是 根应用程序注入器中的实例。外部组件 模块继续接收为应用程序创建的实例 根
这是否意味着当我在延迟加载的模块中访问任何全局声明的提供程序时,我访问它的副本,该副本与根注入器中创建的实例是分开的?
假设我有两种情况:
AppModule
ProviderX
AppComponent
ProviderX
SubpageModule
SubpageComponent
ProviderX
AppModule
ProviderX
AppComponent
ProviderX
SubpageModule
ProviderX
SubpageComponent
ProviderX
在情况A中,ProviderX
中SubpageComponent
的实例是与AppComponent
中的实例相同还是不同的实例?我理解情况B他们不是。
答案 0 :(得分:4)
情况A
AppComponent和SubpageComponent获得相同实例注入
情况B
AppComponent和SubpageComponent获得不同实例注入
使用您的设置,您将获得类似
的注入器层次结构- AppModule
|- AppComponent
|- SubPageModule
|- SubpageComponent
从需要向树结构注入值的位置进行角度搜索,直到找到第一个匹配的提供程序。然后它注入第一个找到的提供者提供的实例。