1

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

<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

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

4

1 回答 1

0

组件DemoComponent及其子组件SampleService在具有SampleService构造函数参数时将被注入。

指令DirADirective将被SpecialSampleService注入。

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

最后的手段是根范围,添加到其中的提供程序@NgModule()被保留。

所以优先规则是,self,parent,parent of parent,......根范围。

于 2016-11-16T10:22:18.060 回答