Почему инжектор Angular обнаруживает следующее, даже если его нет в иерархии инжекторов?
Из официальных документов ниже приведен пример
lightweight injection token
шаблон для включения встряхивания дерева:
abstract class LibHeaderToken {}
@Component({
selector: 'lib-header',
providers: [
{provide: LibHeaderToken, useExisting: LibHeaderComponent}
]
...,
})
class LibHeaderComponent extends LibHeaderToken {}
@Component({
selector: 'lib-card',
...,
})
class LibCardComponent {
@ContentChild(LibHeaderToken) header: LibHeaderToken|null = null;
}
Мой вопрос в том, что когда Angular видит
@ContentChild(LibHeaderToken)
, он попытается найти провайдера с именем токена как
LibHeaderToken
, но он будет искать его в текущем компоненте или его родителях (потому что это иерархический инжектор). Он не будет искать (именно здесь мы объявили требуемый провайдер).
Итак, почему это работает и почему
LibHeaderComponent
тоже ищут при поиске провайдеров?
1 ответ
Если вы ищете определение декоратора @Contentchild , оно написано в исходных документах:
Поддерживаются следующие селекторы.
- Любой класс с декоратором @Component или @Directive
- Ссылочная переменная шаблона в виде строки (например, запрос <my-component #cmp> с @ContentChild('cmp'))
- Любой провайдер, определенный в дереве дочерних компонентов текущего компонента (например, @ContentChild(SomeService) someService: SomeService)
- Любой провайдер, определенный через токен строки (например, @ContentChild('someToken') someTokenVal: any)
- TemplateRef (например, запрос с шаблоном @ContentChild(TemplateRef);)
В списке маркеров третий маркер говорит: «Любой поставщик, определенный в дереве дочерних компонентов текущего компонента (например, @ContentChild(SomeService) someService: SomeService)» . Таким образом, в примере LibCardHeader находится в дереве дочерних компонентов LibCardComponent , а LibHeaderToken — это поставщик, определенный в LibCardHeader , который является дочерним компонентом, что соответствует объяснению «Любой поставщик, определенный в дереве дочерних компонентов текущего компонента». . Текущий компонент — LibCardComponent .
редактировать: ссылка на документы