通过多个指令提供服务时的优先顺序是什么?

时间:2016-11-16 10:20:02

标签: angular angular2-directives angular2-di

我希望能够通过添加指令来修改组件行为。

<demo>Basic behaviour</demo>
<demo dira>Modified behaviour</demo>

我的方法是定义服务类中的行为,这些行为由组件提供。这些指令有自己的服务提供者,因此会覆盖组件的提供者。

@Component({
    selector: "demo",
    providers: [SampleService]
})
export class DemoComponent{
    constructor( private sampleService: SampleService) {
    }
}

@Directive({
    selector: "[dira]",
    providers: [ {provide:SampleService, useClass:SpecialSampleService}]
})
export class DirADirective {
}

这确实有效,但是当有多个指令提供具有相同令牌的服务时,我找不到关于会发生什么的规则:

<demo dira dirb></demo>

根据我的观察,似乎指令中的提供者总是优先于组件中的提供者。在指令之间,它始终是声明数组中的最后一个(不在HTML中)“赢”。

Plunkr:https://plnkr.co/edit/jdN9GaRTzoe7UQj2PIeP?p=preview

我的问题是,是否支持这种提供者覆盖,如果我至少可以依赖我的假设,那么指令提供的服务总是优先于组件提供的服务?

1 个答案:

答案 0 :(得分:0)

组件DemoComponent,当他们拥有SampleService个构造函数参数时,它们会被SampleService注入。

指令DirADirective会注明SpecialSampleService

DI查看具有提供者构造函数参数的组件或指令。如果它找不到匹配的提供者,它会一直看着父母,直到找到一个。

最后一种方法是根范围,其中保留了添加到@NgModule()的提供程序。

所以优先规则是,自我,父母,父母的父母,......根范围。