3

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

我可以在引导级别设置提供程序

bootstrap(AppComponent, [Service]);

在根组件中

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

或在子组件级别。

这次的问题:

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

2 回答 2

2

3.

依赖注入是分层的

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

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

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

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

WhenMyService也注册在 中sub-component2那么当sub-sub-component请求 a时MyService,它会从中获取一个,sub-component2因为这是它找到的第一个。当sub-component1还请求MyServiceDI 时,将返回 of 之一,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然后分配对a 的引用,myService并且代码 inSubComponent可以读取和写入MyServicess 字段并调用其方法。

4.如果 someComponent 注入 someService,其中注入了 someService2,我需要在 someComponent 的级别上将它们都设置为提供者 [someService, someService2] 吗?如果我已经在上层组件中注入了 someService2 somewere 或/和?

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

所以,简短的回答:是的。由 DI 注入的所有东西都需要一个注册的提供者。

5.为什么 HTTP_PROVIDERS 设置在 bootstrap 级别?

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

export class MySpecialHttp {
}

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

在这里,我们指示 DI,当SubSubComponent它或其中一个子组件请求时,改为Http传入。MySpecialHttp

于 2016-01-23T16:19:18.583 回答
0

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

当一个组件有providers: [MyService]一行时,这意味着该组件和所有子组件将共享同一个/单个服务实例。

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

HTTP_PROVIDERS 通常在引导程序中设置,因为我们通常只需要这些类/服务的一个实例。

于 2016-01-23T16:19:09.763 回答