This tutorial并没有谈论模块如何适应注入器树,除了这个短语:
所有请求都冒泡到我们的根NgModule注入器 使用bootstrapModule方法配置。
是否意味着如果在树上的任何组件上找不到提供程序,则仅检查根模块并且不检查其他中间模块?例如,下图显示了具有一个根组件的组件树,组件3和4在其自己的模块中声明。根模块有自己的提供者,红色模块有自己的提供者。当组件3请求服务时,是否忽略红色模块上的提供程序并检查父组件上的提供程序,如果找不到,则返回根模块上的提供程序?
答案 0 :(得分:1)
我认为您正在寻找https://angular.io/docs/ts/latest/cookbook/ngmodule-faq.html#!#q-module-provider-visibility
为什么功能模块中提供的服务随处可见? 在引导模块的@ NgModule.providers中列出的提供程序 有适用范围。添加服务提供商 @ NgModule.providers有效地将服务发布到整个服务 应用
当我们导入模块时,Angular会添加模块的服务提供商 (其提供者列表的内容)到应用程序根注入器。
这使得提供程序对应用程序中的每个类都可见 知道提供者的查找令牌。
这是设计的。通过模块导入的可扩展性是主要的 Angular模块系统的目标。将模块提供商合并到 应用程序注入器使模块库很容易丰富 整个应用程序与新服务。通过添加HttpModule一次, 每个应用程序组件都可以发出http请求。
然而,如果您期待,这可能会让您觉得不受欢迎 模块的服务只对声明的组件可见 那个功能模块。如果HeroModule提供HeroService和 根AppModule导入HeroModule,任何知道它的类 HeroService类型可以注入该服务,而不仅仅是类 在HeroModule中声明。
模块的提供者被添加到根范围。重复被丢弃。这意味着可以从整个应用程序中找到提供程序,除非它们在组件或延迟加载的模块上被覆盖。延迟加载的模块获得自己的根范围。
如果红色模块是延迟加载的,那么组件3将从该模块获取提供者,如果它急切地加载红色模块的提供者被添加到应用程序的根范围,组件3将获得它从那里。这与@NgModule()
添加到@Component()
或@Directive()
的提供商不会被提升到任何根范围。 DI从对其父项及其父项父项具有依赖性的组件中查找,...对于提供程序,最后在应用程序的根范围内,或者在延迟加载的模块的根范围内(如果组件是其中一部分)