中间模块提供商如何适应注入树

时间:2016-11-21 07:06:43

标签: javascript angular angular2-services

This tutorial并没有谈论模块如何适应注入器树,除了这个短语:

  

所有请求都冒泡到我们的根NgModule注入器   使用bootstrapModule方法配置。

是否意味着如果在树上的任何组件上找不到提供程序,则仅检查根模块并且不检查其他中间模块?例如,下图显示了具有一个根组件的组件树,组件3和4在其自己的模块中声明。根模块有自己的提供者,红色模块有自己的提供者。当组件3请求服务时,是否忽略红色模块上的提供程序并检查父组件上的提供程序,如果找不到,则返回根模块上的提供程序? enter image description here

1 个答案:

答案 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从对其父项及其父项父项具有依赖性的组件中查找,...对于提供程序,最后在应用程序的根范围内,或者在延迟加载的模块的根范围内(如果组件是其中一部分)