我希望能够通过添加指令来修改组件行为。通过多个指令提供服务时,优先级的规则是什么?
<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
我的问题是是否支持这种提供者压倒一切的,如果我至少可以依靠我的假设,即由指令提供的服务始终优先于组件提供的服务?
什么是指令到有关组件树组件的关系?他们是否被视为儿童,父母或某种兄弟姐妹?从我的测试中,DemoComponent从其DirADirective中注入了SpecialSampleService,即使它提供了自己的SampleService。所以要么我不理解生成的组件层次结构或者注入器合并组件的提供者及其指令的规则。 –
他们是兄弟姐妹。 “DemoComponent被注入了SpecialSampleService”如果是这样的话,那对我来说也是非常令人惊讶的。 –
也许他们共享一个范围,如果他们被添加到相同的元素和指令的提供者稍后添加并覆盖组件的提供者。 https://plnkr.co/edit/zYQVsLdsHpsmqLsLF19O?p=preview。非常有趣的情况。 –