2016-11-16 118 views
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

我的问题是是否支持这种提供者压倒一切的,如果我至少可以依靠我的假设,即由指令提供的服务始终优先于组件提供的服务?

回答

0

组件DemoComponent当它们具有SampleService构造函数参数时,它的子节点将获得SampleService注入。

指令DirADirective将获得SpecialSampleService注入。

DI着眼于对供应商构造函数的参数组件或指令。如果找不到匹配的供应商,它会一直查找父母,直到找到一个。

最后的手段是根范围,其中提供者添加到@NgModule()保持。

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

+0

什么是指令到有关组件树组件的关系?他们是否被视为儿童,父母或某种兄弟姐妹?从我的测试中,DemoComponent从其DirADirective中注入了SpecialSampleService,即使它提供了自己的SampleService。所以要么我不理解生成的组件层次结构或者注入器合并组件的提供者及其指令的规则。 –

+0

他们是兄弟姐妹。 “DemoComponent被注入了SpecialSampleService”如果是这样的话,那对我来说也是非常令人惊讶的。 –

+0

也许他们共享一个范围,如果他们被添加到相同的元素和指令的提供者稍后添加并覆盖组件的提供者。 https://plnkr.co/edit/zYQVsLdsHpsmqLsLF19O?p=preview。非常有趣的情况。 –