4

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

4

3 回答 3

5

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

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

这是一个示例:

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

在这样的应用中,我们有三个注入器:

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

这意味着当尝试将 注入Service1构造ChildComponent函数时,Angular2 将查看注入ChildComponent器,然后查看注入器,AppComponent最后查看应用程序。

由于Service2需要注入Service1,所以会做同样的解析处理:ChildComponentinjector, AppComponentone and application one。

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

这个答案可以帮助你:

于 2016-02-23T16:20:43.617 回答
2

这有点奇怪,但只有组件才能在 Angular 中配置依赖注入(嗯,和bootstrap(),但本质上与根组件相同)。即,只有组件可以指定提供者。

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

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

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

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

于 2016-02-23T17:50:50.637 回答
0

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

另请参阅https://github.com/angular/angular/issues/5622

于 2016-02-23T16:19:07.687 回答