繁体   English   中英

Angular2 - 注入@Injectable

[英]Angular2 - inject into @Injectable

我有一个Angular2应用程序,其中包含用于从API获取数据的service 这个例子之后,我想创建一个单独的文件,其中应该包含一些配置数据。 我的问题是我的服务有一个@Injectable()装饰器,我不确定我是否可以在元数据中传递一个provide数组,我将在其中注入配置,如教程中所示。 有人遇到过这样的问题,欢迎分享他的解决方案:)

实际上,Angular2利用分层喷射器和喷射器链接到组件。 简而言之,您只能在组件( providers属性)或应用程序级别( bootstrap功能)上定义提供程序。

关于服务,他们将能够使用对发起呼叫的组件可见的提供者,但是您无法在其级别定义提供者。

这是一个示例:

Application
     |
AppComponent
     |
ChildComponent
  getData()     --- Service1 --- Service2

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

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

这意味着,试图将注入时, Service1ChildComponent构造,Angular2将调查ChildComponent注射器,然后进入AppComponent一个最后进入应用程序之一。

由于Service2需要被注入到Service1 ,相同分辨率的处理会做到: ChildComponent注射器, AppComponent一个应用程序之一。

这意味着可以使用组件的providers属性和应用程序注入器的bootstrap函数的第二个参数,根据您的需要在每个级别指定Service1Service2

这个答案可以帮助你:

这有点奇怪,但只有组件可以在Angular(well和bootstrap()配置依赖注入,但这与root组件基本相同)。 即,只有组件可以指定提供者。

正如@Thierry在他的回答中提到的,如果组件具有指定的providers数组,则组件树中的每个组件将获得关联的“注入器”。 我们可以把它想象成一个注入器树,它(通常很多)比组件树更稀疏。 当需要解析依赖关系时,将查询此注入器树。 能够满足依赖性的第一个注入器就是这样做的。 注入器树朝向根组件/注入器向上走。

因此,为了使您的服务注入配置对象依赖项,首先必须使用注入器注册该配置对象。 即,在组件的providers数组中,调用
provide(stringToken or OpaqueToken, {useValue: MyConfigObject} )
此注册必须发生在您要使用/注入服务的组件或其上方某处。

然后,您的服务应该能够@Inject注册的配置对象,因为它将在注入器树中找到它。

请注意,由于只有组件可以配置提供程序,因此@Injectable()装饰器不支持任何配置选项,因此不支持providers数组。

这不受支持。 对于服务,需要将提供程序添加到bootstrap(AppComponent, [..., Service, ServiceDependency1, ...])

另见https://github.com/angular/angular/issues/5622

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM