假设我们有一个名为Comp的Component 和两个名为P1和P2的 @Injectable提供者.
P1需要P2的实例.
P1注入Comp
如果我在Comp上声明两个提供程序,那就完美了,就像这样:
@Component ({
providers: [P1, P2]
})
export class Comp { ... }
Run Code Online (Sandbox Code Playgroud)
现在我想做的是声明P1直接在P1内部需要P2:
@Component ({
providers: [P1]
})
export class Comp { ... }
@Injectable(/** Inject P2 here **/)
export class P1 { ... }
Run Code Online (Sandbox Code Playgroud)
谢谢你的帮助.
Thi*_*ier 14
实际上,注入器只能配置组件级别或引导应用程序时.
当您将提供程序设置为组件级别时,处理中涉及的每个类都将具有对这些提供程序的访问权限:子组件,服务.但是您无法为服务本身配置提供程序.
如果在引导级别配置提供程序(调用该bootstrap函数时),则应用程序中的所有元素都将能够使用这些提供程序.
实际上,Angular2的依赖注入器利用了分层注入器.这意味着在某个级别找不到提供者,它将在上面的级别中查找,依此类推.
以下是所有这些元素及其关系的概述:
Application
(providers defined in bootstrap)
|
AppComponent
(providers defined in the providers attribute)
|
ChildComponent
(providers defined in the providers attribute)
getData() --- Service1 --- Service2
Run Code Online (Sandbox Code Playgroud)
为了能够使用Service2的Service1,相应的提供者必须在提供的树被发现.
在这种应用中,我们有三个注射器:
bootstrap函数的第二个参数配置的应用程序注入器AppComponent可以使用providers此组件的属性配置的注入器.它可以"看到"应用程序注入器中定义的元素.这意味着如果在此提供程序中找不到提供程序,它将自动查找此父注入程序.如果在后者中找不到,则会抛出"找不到提供者"错误.ChildComponent将遵循比相同的规则喷油器AppComponent之一.要注入为组件执行的注入链中涉及的元素,将首先在此注入器中查找提供者,然后在AppComponent一个注册器中查找提供者,最后在应用程序中查找提供者.这个答案可以为您提供有关分层注入器的更多详细信息:
| 归档时间: |
|
| 查看次数: |
8719 次 |
| 最近记录: |