我希望能够通过添加指令来修改组件行为。
<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
我的问题是,是否支持这种提供者覆盖,如果我至少可以依赖我的假设,那么指令提供的服务总是优先于组件提供的服务?
答案 0 :(得分:0)
组件DemoComponent
,当他们拥有SampleService
个构造函数参数时,它们会被SampleService
注入。
指令DirADirective
会注明SpecialSampleService
。
DI查看具有提供者构造函数参数的组件或指令。如果它找不到匹配的提供者,它会一直看着父母,直到找到一个。
最后一种方法是根范围,其中保留了添加到@NgModule()
的提供程序。
所以优先规则是,自我,父母,父母的父母,......根范围。