【问题标题】:What is the rule of precedence when providing services through multiple directives?通过多个指令提供服务时的优先规则是什么?
【发布时间】:2016-11-16 10:20:01
【问题描述】:

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

<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

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

【问题讨论】:

    标签: angular angular2-directives angular2-di


    【解决方案1】:

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

    指令DirADirective 将注入SpecialSampleService

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

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

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

    【讨论】:

    • 关于组件树的指令与组件的关系是什么?他们被认为是孩子、父母还是某种兄弟姐妹?根据我的测试,DemoComponent 从其 DirADirective 中注入了 SpecialSampleService,即使它提供了自己的 SampleService。因此,要么我不了解生成的组件层次结构,要么不了解注入器合并组件提供者及其指令的规则。
    • 他们是兄弟姐妹。 “DemoComponent 被注入 SpecialSampleService” 如果是这样的话,我也很惊讶。
    • 如果它们被添加到同一个元素并且稍后添加指令的提供者并覆盖组件的提供者,它们可能共享一个范围。 plnkr.co/edit/zYQVsLdsHpsmqLsLF19O?p=preview。非常有趣的案例。
    • 看起来那样。如果指令没有提供者,只有组件,指令仍然从组件中获取提供者,而我预计它会抛出“找不到提供者”。 plnkr.co/edit/nYDI2Ctqtf6C0DOIjbnV?p=preview
    • 感谢您的调查。我找不到任何关于此的文档,但这种行为对我来说似乎是故意的。否则,如果指令无法共享,提供服务的意义何在?
    猜你喜欢
    • 2013-03-29
    • 2013-08-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-04-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多