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 ではなく) の最後のものです。

プランク: https://plnkr.co/edit/jdN9GaRTzoe7UQj2PIeP?p=preview

私の質問は、この種のプロバイダーのオーバーライドがサポートされているかどうか、そして少なくとも私の仮定に頼ることができれば、ディレクティブによって提供されるサービスは常にコンポーネントによって提供されるサービスよりも優先されるということです?

4

1 に答える 1

0

コンポーネントDemoComponentとその子は、コンストラクタ パラメータSampleServiceがある場合に注入されます。SampleService

ディレクティブDirADirectiveSpecialSampleService注入されます。

DI は、プロバイダーのコンストラクター パラメーターを持つコンポーネントまたはディレクティブを調べます。一致するプロバイダーが見つからない場合は、見つかるまで親を検索し続けます。

最後の手段は、追加されたプロバイダーが保持されるルート スコープです@NgModule()

したがって、優先順位の規則は、自己、親、親の親、... ルート スコープです。

于 2016-11-16T10:22:18.060 に答える