角度2 - 注入@Injectable

Angular2 - inject into @Injectable

本文关键字:@Injectable 注入 角度      更新时间:2023-09-26

我有一个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 函数的第二个参数,根据您的需要在每个级别指定Service1Service2

这个答案可以帮助你:

  • 在 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