Angular2提供商自举VS @Component
问题描述:
从我的理解,你可以在你的引导呼叫定义应用程序供应商是这样的:Angular2提供商自举VS @Component
bootstrap(
App,
[disableDeprecatedForms(), provideForms()]]
)
或在你的根组件是这样的:
@Component({
selector: 'my-app',
providers: [disableDeprecatedForms(), provideForms()],
...
)
然而,我创建了一个需要提供表单提供者的表单验证器插件,并且此引导仅在引导选项时起作用。我创建了一个plunk to illstrate the problem:如果将providerForms()添加到引导程序调用,则验证程序将起作用。只要我从bootstrap调用注释掉providerForms(),验证器就不再工作。我认为组件中的providerForms定义是足够的。任何解释?
答
Angular2 DI总是向上查找请求依赖项的提供者。如果一个由bootstrap实例化的服务需要一个依赖关系,那么它不会得到一个被注入的东西,而这个东西是在树的下面提供的。
在根组件提供的bootstrap(...)
和@Component(...)
并不等同,但是这种区别与根组件或其子组件或其子组件中的所有内容无关。 bootstrap()
比根组件高一级。
Angular2风格指南还建议优先选择bootstrap()
以上的根组件,因为bootstrap应该保留给系统的东西。
形式和路由器需要创建第一组件之前被实例化(有例如在根组件需要注入Router
或含有routerLink
的V3路由器的早期版本中的错误,否则该路由器止跌” t启动)。
因此,因为有些事情需要在创建根组件之前实例化,所以出现bootstrap()
与根组件之间的差异变得相关的情况。
运行时编译器在将提供程序注入AppComponent之前创建。这种方式编译器使用旧的窗体类到AppComponent.template.js中。 AppComponent的提供者中的方法'useFactory'仅在将令牌插入构造函数时触发。 https://plnkr.co/edit/Ed8ao38phPNsYeHMorcg?p=preview – yurzui