关于angular2提供者的一些问题

Some questions about angular2 providers

抱歉,我是编程新手,没有朋友知道这个话题,所以我要用我愚蠢的问题淹没 Whosebug。

我可以在 bootstrap 级别设置供应商

bootstrap(AppComponent, [Service]);

在根组件中

@Component({
    providers: [Service],
    //...

或在子组件级别。

本期问题:

  1. 我会简化,但是如果someService 设置为someComponent 的提供者,是否意味着someComponent 具有someService 的字段和方法? 提供者提供服务的方法和字段给组件来实例化新的实例?
  2. 已删除
  3. 如果我提供服务,它的方法可以以某种方式在较低级别调用?
  4. 如果 someComponent 注入了 someService,其中注入了 someService2,我是否需要在 someComponent 级别上将它们 [someService, someService2] 都设置为提供者?如果我已经在上层组件中注入了 someService2 somewere or/and?
  5. 为什么 HTTP_PROVIDERS 设置在 bootstrap 级别?

您应该阅读开发指南中的 Hierarchical Injectors。它会回答你的大部分问题。

当组件有 providers: [MyService] 行时,表示该组件和所有子组件将共享服务的 same/single 实例。

如果一个服务需要注入另一个服务,它将查找组件树以找到所需服务的提供者,并使用它首先找到的提供者。

HTTP_PROVIDERS经常设置在bootstrap因为我们往往只想要这些classes/services.

的一个实例

3.

依赖注入是分层的

bootstrap()
|-app-component
  |-sub-component1
  |-sub-component2
    |-sub-sub-component21

当组件或服务由 Angulars DI 实例化时,它会检查构造函数期望的参数并尝试查找匹配的提供程序。

当创建 sub-sub-component 并且它具有类似 constructor(myService: MyService) 的构造函数时,如果 DI 找到匹配的提供程序,它会从 sub-sub-components 个提供程序开始向上查找。如果它到达 `bootstrap() 并且仍然没有找到它失败并显示一条错误消息。

对于层次结构中的每一层,只创建一个提供者实例。 当 MyServicebootstrap() 中注册为提供者时,任何请求 MyService 的组件都将在 bootstrap().

中创建的同一实例中传递

MyServicesub-component2中注册时,那么当sub-sub-component请求一个MyService时,它会得到一个来自 sub-component2 因为这是它找到的第一个。当 sub-component1 也请求 MyService DI 时,DI 将 return bootstrap() 之一,因为向上的层次结构没有其他提供 MyService

如果您想与整个应用程序共享一些数据,只需在 bootstrap() 上注册您要用于共享数据的服务。

1.

如果一个组件('sub-component')有一个像

这样的构造函数
export class SubComponent {
  constructor(private myService: MyService) {
  }

  someName: string;

  clickHandler($event) {
    this.myService.clickHappended = true;
    this.someName = this.myService.loadNameFromServer();
  }
}

然后将对 MyService 的引用分配给 myServiceSubComponent 中的代码可以读取和写入 MyServices 的字段并调用其方法。

4. And if someComponent inject someService, in which injected someService2, do I need to set as provider both of them [someService, someService2] on level of someComponent? And if I already inject someService2 somewere or/and in upper-level-component?

当组件 class 或服务 class 由 Angular 创建时,它使用 DI。它查找所请求类型的提供者并创建一个实例或使用现有实例。当 DI 创建实例时,它会检查该类型的构造函数并再次查找这些类型的提供者。这在任意级别递归,(即使在 DI 需要一些帮助的循环中)

所以,简短的回答:是的。 DI 注入的所有内容都需要注册提供者。

5. Why HTTP_PROVIDERS set's up in bootstrap-level?

HTTP_PROVIDERS提供的classes可以被整个应用程序重用。不需要为每个 HTTP 请求创建一个新实例,也不需要每个组件或服务都有自己的 Http class 实例。如果您希望特定组件使用不同的 Http class,您可以将特定的 Http class 添加到该组件的提供者列表中。此组件及其所有 sub-components 将改用此提供程序。

export class MySpecialHttp {
}

@Component(selector: 'sub-sub',
   providers: [provide(Http, {useClass: MySpecialHttp})]
export class SubSubComponent {
  constructor(http: Http) {}
}

这里我们指示 DI,当 SubSubComponent 或其中之一 child-components 请求 Http 时,改为传入 MySpecialHttp