2016-01-23 35 views
3

对不起,我是编程新手,没有人的朋友,谁知道这个话题,所以我要用我愚蠢的问题来淹没计算器。关于angular2提供者的一些问题

我可以引导水平

bootstrap(AppComponent, [Service]); 

设置提供商在rootComponent

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

或者在子组件级别。

问题,这个时间:

  1. 我将简化,但如果someService设置作为一个提供商someComponent,是不是就意味着someComponent有someService的领域和方法? 提供者提供服务的方法和组件来实例化新的实例?
  2. 删除
  3. 如果我提供服务,它的方法莫名其妙地可以调用较低级别?
  4. 如果someComponent注入someService,其中注入someService2,我需要在someComponent的级别上设置它们两个[someService,someService2]吗?如果我已经注入了一些服务2有些是/或在上层组件?
  5. 为什么HTTP_PROVIDERS设置在引导级别?

回答

2

依赖注入是分层

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将返回bootstrap()之一,因为层次向上没有别的提供MyService

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

1.

如果一个组件( '子组件')具有像

export class SubComponent { 
    constructor(private myService: MyService) { 
    } 

    someName: string; 

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

然后到MyService一个引用被分配给myService和代码在构造SubComponent可以读取和写入MyServices的字段并调用其方法。

4.如果someComponent注入someService,所注入的someService2,我是否需要将其设置为供应商两者[someService,someService2]上someComponent的水平?如果我已经注入了一些服务2有些是/或在上层组件?

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

所以,简短的回答:是的。 DI注入的所有东西都需要注册供应商。

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

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代替。

0

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

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

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

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