Почему инжектор 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 , оно написано в исходных документах:

Поддерживаются следующие селекторы.

  1. Любой класс с декоратором @Component или @Directive
  2. Ссылочная переменная шаблона в виде строки (например, запрос <my-component #cmp> с @ContentChild('cmp'))
  3. Любой провайдер, определенный в дереве дочерних компонентов текущего компонента (например, @ContentChild(SomeService) someService: SomeService)
  4. Любой провайдер, определенный через токен строки (например, @ContentChild('someToken') someTokenVal: any)
  5. TemplateRef (например, запрос с шаблоном @ContentChild(TemplateRef);)

В списке маркеров третий маркер говорит: «Любой поставщик, определенный в дереве дочерних компонентов текущего компонента (например, @ContentChild(SomeService) someService: SomeService)» . Таким образом, в примере LibCardHeader находится в дереве дочерних компонентов LibCardComponent , а LibHeaderToken — это поставщик, определенный в LibCardHeader , который является дочерним компонентом, что соответствует объяснению «Любой поставщик, определенный в дереве дочерних компонентов текущего компонента». . Текущий компонент — LibCardComponent .

редактировать: ссылка на документы

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