bootstrap()的第二个参数究竟是什么?

时间:2015-12-28 22:58:55

标签: angular

我有一个Api类来处理与服务器的所有交互。

@Component({
  providers: [Http, HTTP_PROVIDERS]
})
export class Api {
  constructor(private http: Http) {}

  // functions for different Api end points
}

如果我想将Api课程注入我的Home组件,我可以这样:

@Component({
  selector: 'my-app',
  directives: [FORM_DIRECTIVES, CORE_DIRECTIVES],
  templateUrl: '/app/views/home.html',
  providers: [Api, HTTP_PROVIDERS] // specifically this line
})
export class HomeComponent {
  constructor(private api: Api) {} // and this line

  ...
}

没有HTTP_PROVIDERS Api没有注明Http。无论好坏,这导致我在API_PROVIDERS课程中创建Api,这样如果需要更多注入,我就不必更新Api的每个地方注入(这可能是应用程序中的大多数组件)。这改变了这样的事情:

// at the bottom of my Api Component
export var API_PROVIDERS = [Api, HTTP_PROVIDERS];

...

// in my Home Component
@Component({
  selector: 'my-app',
  directives: [FORM_DIRECTIVES, CORE_DIRECTIVES],
  templateUrl: '/app/views/home.html',
  providers: [API_PROVIDERS]
})

这是因为我没有得到DI错误,我的代码似乎正常运行。但是,如果我将该提供程序移动到我的引导程序调用(在boot.ts中,最初由SystemJS加载的文件),我得到这个:

bootstrap(AppComponent, [API_PROVIDERS]);

现在,我不需要providers组件或@Component组件的Home定义中的Api属性。似乎只有ApiHTTP_PROVIDERS可用于准备注入构造函数的所有内容。

// Api Component becomes
@Component({})

// Home Component becomes
@Component({
  selector: 'my-app',
  directives: [FORM_DIRECTIVES, CORE_DIRECTIVES],
  templateUrl: '/app/views/home.html'
})

Http注入Api并将Api注入Home组件也是有效的(它们仍然是构造函数中的参数)。页面底部的Angular 2 Api for bootstrap状态表示第二个参数是:

  

customProviders:可以添加到应用程序注入器的另一组提供程序,以覆盖默认的注入行为。

我不太明白这意味着什么,或者通过将我的提供者包含在那里而不是@Component装饰者内部,我会看到什么副作用。我们可能不应该把我们想要注入的所有东西都放到bootstrap参数中,因为那时我们根本不需要providers中的@Component属性。

当我在bootstrap()的第二个参数而不是@Component装饰器中列出我的提供商时会发生什么变化?该参数用于什么?

我正在使用Angular 2的2.0.0-beta.0版本。

1 个答案:

答案 0 :(得分:3)

Hierarchical Injectors dev guide中解释了这一点。

在引导程序级别,每个应用程序会获得一个实例。

在组件级别,每个组件可以获得一个实例。