Каково правило приоритета при предоставлении услуг через несколько директив?

Я хотел бы иметь возможность изменить поведение компонента, добавив директивы.

<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

Мой вопрос заключается в том, поддерживается ли этот тип переопределения поставщика и если я могу хотя бы полагаться на свое предположение, что службы, предоставляемые директивами, всегда имеют приоритет над службами, предоставляемыми компонентами?

1 ответ

Составная часть DemoComponent и это дети получат SampleService вводится, когда у них есть SampleService параметры конструктора.

директива DirADirective получит SpecialSampleService впрыскивается.

DI смотрит на компонент или директиву, которая имеет параметр конструктора для провайдеров. Если он не может найти подходящего поставщика, он продолжает смотреть на родителей, пока не найдет его.

В крайнем случае это корневая область, в которую добавляются поставщики. @NgModule() хранятся.

Таким образом, правило приоритета: "Я", "Родитель", "Родитель родителя",... корневая область.

Другие вопросы по тегам