2016-11-21 53 views
1

This tutorial并不多谈模块如何适应注射器树除了这句话:如何中介模块供应商融入注射器树

的所有请求都泡到根NgModule注射器,我们 使用bootstrapModule方法进行配置。

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

+0

你可以使用augury来检查你的依赖关系图。 – Manish

+0

@ user32,谢谢,我会看看 –

回答

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将从那里获取它。这是所有与由添加到@Component()@Directive()@NgModule()

提供商添加并不提升到任何根范围提供商。 DI从对其父代及其父代有依赖关系的组件中查找,对于提供者以及最后在应用程序的根作用域中或在延迟加载模块的根作用域中查找(如果组件是一个组件的一部分) 。

+0

谢谢,但你能解释在问题中提出的特定情况下会发生什么吗? –

+0

模块的提供者被添加到根作用域。丢弃重复项。这意味着提供程序可以从整个应用程序中找到,除非它们在组件或延迟加载的模块上被重写。延迟加载的模块获取它们自己的根作用域。 –

+0

我明白了,谢谢。那么你在说什么,在我的特殊情况下,它取决于红色模块是否被延迟加载,是否正确?如果延迟加载,那么组件'3'将从注册在红色模块上的提供程序获得服务,如果它被急切加载,则将使用比根模块上的提供程序更多的服务? –

相关问题