Bootstrap与@component中的Angular2提供程序

时间:2016-07-31 19:33:27

标签: angular dependency-injection provider

根据我的理解,您可以在引导程序调用中定义应用程序提供程序,如下所示:

bootstrap(
  App,
  [disableDeprecatedForms(), provideForms()]]
)

或在您的根组件中,如下所示:

@Component({
  selector: 'my-app',
  providers: [disableDeprecatedForms(), provideForms()],
  ...
)

但是,我创建了一个表单验证器插件,它需要provideForms提供程序,而且只有bootstrap选项才能使用此指令。我创建了一个document:验证器工作,如果我将providerForms()添加到bootstrap调用。一旦我从引导程序调用中注释掉providerForms(),验证程序就不再起作用了。我假设组件中的providerForms定义已足够。任何解释?

1 个答案:

答案 0 :(得分:3)

Angular2 DI总是向上查找请求的依赖项的提供者。如果由引导程序实例化的服务需要一个依赖项,而不是一个注入的服务,它将在树中进一步提供。

在根组件的bootstrap(...)@Component(...)处提供的内容并不等同,但这种区别与根组件内的所有内容或其子项或其他后代之间的内容无关。 bootstrap()比根组件高一级。

Angular2样式指南还建议优先选择bootstrap()的根组件,因为应该为系统内容保留引导程序。

表单和路由器需要在创建第一个组件之前进行实例化(例如,在V3路由器的早期版本中存在一个错误,其中根组件需要注入Router或包含{{1} ,否则路由器将无法启动)。

因为在根组件创建之前需要实例化一些事情,所以routerLink和根组件之间的差异变得相关的情况就会出现。