2016-07-31 74 views
4

从我的理解,你可以在你的引导呼叫定义应用程序供应商是这样的:Angular2提供商自举VS @Component

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

或在你的根组件是这样的:

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

然而,我创建了一个需要提供表单提供者的表单验证器插件,并且此引导仅在引导选项时起作用。我创建了一个plunk to illstrate the problem:如果将providerForms()添加到引导程序调用,则验证程序将起作用。只要我从bootstrap调用注释掉providerForms(),验证器就不再工作。我认为组件中的providerForms定义是足够的。任何解释?

+0

运行时编译器在将提供程序注入AppComponent之前创建。这种方式编译器使用旧的窗体类到AppComponent.template.js中。 AppComponent的提供者中的方法'useFactory'仅在将令牌插入构造函数时触发。 https://plnkr.co/edit/Ed8ao38phPNsYeHMorcg?p=preview – yurzui

回答

3

Angular2 DI总是向上查找请求依赖项的提供者。如果一个由bootstrap实例化的服务需要一个依赖关系,那么它不会得到一个被注入的东西,而这个东西是在树的下面提供的。

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

Angular2风格指南还建议优先选择bootstrap()以上的根组件,因为bootstrap应该保留给系统的东西。

形式和路由器需要创建第一组件之前被实例化(有例如在根组件需要注入Router或含有routerLink的V3路由器的早期版本中的错误,否则该路由器止跌” t启动)。

因此,因为有些事情需要在创建根组件之前实例化,所以出现bootstrap()与根组件之间的差异变得相关的情况。

+0

您是否了解这些提供商的哪一部分负责此行为?在确定提供者是否符合非根注射器的条件时,我们应该寻找什么?我希望我们在A1中保留了配置/运行歧视,但看起来都一样。 – estus

+0

不确定你的意思是“哪个部分”。我只知道在Angular2 GitHub的问题中提到'provideRouter()'需要在'bootstrap()'中使用,而不是根组件。我并不惊讶'disableDeprecatedForms()'和'provideForms()'需要相同的内容,但我不知道为什么。 –

+0

你能提供一个链接到提到的github问题吗? – schacki