关于angular2提供者的一些问题

时间:2016-01-23 15:59:47

标签: angular angular2-services

抱歉,我是编程方面的新手,并且没有知道该主题的朋友,所以我将通过愚蠢的问题来解决堆栈溢出问题。

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

bootstrap(AppComponent, [Service]);

在rootComponent

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

或在子组件级别。

此时的问题:

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

2 个答案:

答案 0 :(得分: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()但仍然没有找到它,则会失败并显示错误消息。

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

MyService sub-component2中注册时,sub-sub-component请求MyService时,sub-component2将获得sub-component1的{​​{1}}因为这是它找到的第一个。如果MyService还请求bootstrap() DI,则会返回MyService之一,因为层次结构向上,没有其他内容提供bootstrap()

如果您想与整个应用程序共享某些数据,请仅注册您要用于在export class SubComponent { constructor(private myService: MyService) { } someName: string; clickHandler($event) { this.myService.clickHappended = true; this.someName = this.myService.loadNameFromServer(); } } 分享数据的服务。

  

1。

如果组件('子组件')具有类似

的构造函数
MyService

然后将myService的引用分配给SubComponentMyServices中的代码可以读取和写入HTTP_PROVIDERS字段并调用其方法。

  

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

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

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

  

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

整个应用程序可以重用Http提供的类。无需为每个HTTP请求创建新实例,也无需每个组件或服务拥有自己的Http类实例。如果您希望特定组件使用不同的Http类,则可以将该特定export class MySpecialHttp { } @Component(selector: 'sub-sub', providers: [provide(Http, {useClass: MySpecialHttp})] export class SubSubComponent { constructor(http: Http) {} } 类添加到该组件的提供者列表中。该组件及其所有子组件将使用此提供程序。

SubSubComponent

我们在此指示DI,当Http或其中一个子组件请求MySpecialHttp时,请传入void assign(int** a) { // ... } int main() { int** ptr; assign(ptr); }

答案 1 :(得分:0)

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

当组件具有providers: [MyService]行时,表示此组件和所有子组件将共享相同/单个服务实例。

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

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