角度2 - 注入@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
中查找提供程序,最后在应用程序中查找提供程序。
这意味着当尝试将Service1
注入ChildComponent
构造函数时,Angular2 将查看ChildComponent
注入器,然后查看AppComponent
由于Service2
需要注入Service1
,因此将进行相同的分辨率处理:ChildComponent
注射器,AppComponent
一个和应用一个。
这意味着可以使用组件的 providers
属性和应用程序注入器的 bootstrap
函数的第二个参数,根据您的需要在每个级别指定Service1
和Service2
。
这个答案可以帮助你:
- 在 angular 2(Beta)中将一个服务注入另一个服务的最佳方法是什么?
这有点奇怪,但只有组件才能在 Angular 中配置依赖注入(嗯,bootstrap()
,但这本质上与根组件相同)。 即,只有组件才能指定提供程序。
正如@Thierry在他的回答中提到的,如果组件指定了providers
数组,则组件树中的每个组件都将获得一个关联的"注入器"。 我们可以将其视为注入器树,它(通常)比组件树稀疏得多。 当需要解决依赖关系时,将参考此注入器树。 第一个可以满足依赖关系的注入器就是这样做的。 注入器树向上走,朝向根组件/注射器。
依赖项,首先必须向注入器注册该配置对象。 即,在组件的providers
数组中,调用provide(stringToken or OpaqueToken, {useValue: MyConfigObject} )
此注册必须发生在要使用/注入服务的组件的上方或上方的某个位置。
然后,您的服务应该能够@Inject
注册的配置对象,因为它将在注入器树中找到它。
请注意,由于只有组件可以配置提供程序,因此 @Injectable()
修饰器不支持任何配置选项,因此不支持providers
数组。
不支持此操作。对于服务,需要将提供程序添加到bootstrap(AppComponent, [..., Service, ServiceDependency1, ...])
另请参阅 https://github.com/angular/angular/issues/5622
- 使用Objective-C的JavaScript注入方法
- 正在注入包含JS的HTML
- 迷你$provider注入茉莉花和角
- Angularjs工厂注入错误
- 通过命令行/批处理文件打开页面时,将javascript代码注入Google Chrome
- 如何在Ionic Android中将Javascript注入到web视图中
- Android Webview通过Javascript注入CSS
- Meteor:在启动时将html注入客户端文件
- 注入工厂时,Angular停止工作
- 注入Javascript以选择具有指定值的所有单选按钮
- XSS通过地址栏注入
- 注入angularjs指令
- Ember服务在注入组件并在计算属性中使用后是未定义的
- AngularJS依赖注入定时问题
- 如何通过铬扩展注入反应元素
- 如何防止在客户端/服务器两侧对文本框进行sql注入
- Ionic将firebase注入工厂,同时将控制器和服务保存在不同的文件中
- 如何在单元测试中将存储注入Ember.Service
- 注入的HTML仅在Dom中解释为字符串
- 角度2 - 注入@Injectable