[英]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
。 这意味着,试图将注入时, Service1
到ChildComponent
构造,Angular2将调查ChildComponent
注射器,然后进入AppComponent
一个最后进入应用程序之一。
由于Service2
需要被注入到Service1
,相同分辨率的处理会做到: ChildComponent
注射器, AppComponent
一个应用程序之一。
这意味着可以使用组件的providers
属性和应用程序注入器的bootstrap
函数的第二个参数,根据您的需要在每个级别指定Service1
和Service2
。
这个答案可以帮助你:
这有点奇怪,但只有组件可以在Angular(well和bootstrap()
配置依赖注入,但这与root组件基本相同)。 即,只有组件可以指定提供者。
正如@Thierry在他的回答中提到的,如果组件具有指定的providers
数组,则组件树中的每个组件将获得关联的“注入器”。 我们可以把它想象成一个注入器树,它(通常很多)比组件树更稀疏。 当需要解析依赖关系时,将查询此注入器树。 能够满足依赖性的第一个注入器就是这样做的。 注入器树朝向根组件/注入器向上走。
因此,为了使您的服务注入配置对象依赖项,首先必须使用注入器注册该配置对象。 即,在组件的providers
数组中,调用
provide(stringToken or OpaqueToken, {useValue: MyConfigObject} )
此注册必须发生在您要使用/注入服务的组件或其上方某处。
然后,您的服务应该能够@Inject
注册的配置对象,因为它将在注入器树中找到它。
请注意,由于只有组件可以配置提供程序,因此@Injectable()
装饰器不支持任何配置选项,因此不支持providers
数组。
这不受支持。 对于服务,需要将提供程序添加到bootstrap(AppComponent, [..., Service, ServiceDependency1, ...])
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.