我有一个Angular2
应用,其中service
用于从API获取数据。在this示例之后,我想创建一个单独的文件,其中应包含一些配置数据。我的问题是我的服务有@Injectable()
装饰器,我不确定我是否可以在元数据中传递provide
数组,我将在其中注入配置,如教程中所示。任何人都遇到过这样的问题,欢迎分享他的解决方案:)
答案 0 :(得分:5)
事实上,Angular2利用分层注入器和注入器链接到组件。简而言之,您只能在组件(providers
属性)或应用程序级别(bootstrap
函数)上定义提供程序。
关于服务,他们将能够使用对发起呼叫的组件可见的提供商,但您无法在其级别定义提供商。
以下是一个示例:
Application
|
AppComponent
|
ChildComponent
getData() --- Service1 --- Service2
在这种应用中,我们有三个注射器:
bootstrap
函数AppComponent
属性配置的providers
注入器。它可以"看"应用程序注入器中定义的元素。这意味着如果在此提供程序中找不到提供程序,它将自动查找此父注入程序。如果在后者中找不到,则找不到"提供商"错误将被抛出。ChildComponent
注入器遵循与AppComponent
规则相同的规则。要注入为组件执行的注入链中涉及的元素,将首先在此注入器中查找提供者,然后在AppComponent
中查找提供者,最后在应用程序中查找提供者。这意味着当尝试将Service1
注入ChildComponent
构造函数时,Angular2会查看ChildComponent
注入器,然后进入AppComponent
注入器,最后进入申请一。
由于Service2
需要注入Service1
,因此将执行相同的解决方案处理:ChildComponent
注入器,AppComponent
一个和应用程序一。
这意味着可以根据您的需要使用组件的Service1
属性和Service2
函数的第二个参数在每个级别指定providers
和bootstrap
用于应用注射器。
这个答案可以帮到你:
答案 1 :(得分:2)
有点奇怪,但只有组件可以在Angular中配置依赖注入(well,和bootstrap()
,但这与root组件基本相同)。即,只有组件可以指定提供者。
正如@Thierry在他的回答中提到的,组件树中的每个组件都将获得一个关联的注射器"如果组件指定了providers
数组。我们可以把它想象成一个注入器树,它(通常很多)比组件树更稀疏。当需要解析依赖关系时,将查询此注入器树。能够满足依赖性的第一个注入器就是这样做的。进样器树向上走,朝向根部件/进样器。
因此,为了使您的服务注入配置对象依赖项,首先必须使用注入器注册该配置对象。即,在组件的providers
阵列中,呼叫
provide(stringToken or OpaqueToken, {useValue: MyConfigObject} )
此注册必须发生在您要使用/注入服务的组件之上或之上。
您的服务应该能够@Inject
已注册的配置对象,因为它会在注入器树中找到它。
注意,由于只有组件可以配置提供程序,@Injectable()
装饰器不支持任何配置选项,因此不支持providers
数组。
答案 2 :(得分:0)
不支持此功能。对于服务,需要将提供商添加到bootstrap(AppComponent, [..., Service, ServiceDependency1, ...])