在另一个提供者Angular 2上注入提供者

Mar*_*hel 15 angular

假设我们有一个名为Comp的Component 和两个名为P1P2的 @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)

为了能够使用Service2Service1,相应的提供者必须在提供的树被发现.

在这种应用中,我们有三个注射器:

  • 可以使用bootstrap函数的第二个参数配置的应用程序注入器
  • AppComponent可以使用providers此组件的属性配置的注入器.它可以"看到"应用程序注入器中定义的元素.这意味着如果在此提供程序中找不到提供程序,它将自动查找此父注入程序.如果在后者中找不到,则会抛出"找不到提供者"错误.
  • ChildComponent将遵循比相同的规则喷油器AppComponent之一.要注入为组件执行的注入链中涉及的元素,将首先在此注入器中查找提供者,然后在AppComponent一个注册器中查找提供者,最后在应用程序中查找提供者.

这个答案可以为您提供有关分层注入器的更多详细信息: