为什么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中(在这里我们已经声明了所需的提供程序(。

那么,为什么这样做有效,为什么在寻找提供商时也会搜索LibHeaderComponent呢?

如果您寻找@Contentchild装饰器的定义,它是在原始文档中编写的:

支持以下选择器。

  1. 任何带有@Component或@Directive装饰器的类
  2. 作为字符串的模板引用变量(例如查询<我的组件#cmp>带有@ContentChild('cp'((
  3. 当前组件的子组件树中定义的任何提供程序组件(例如@ContentChild(SomeService(SomeService:SomeService(
  4. 通过字符串令牌定义的任何提供者(例如。@ContentChild('someToken'(someTokenVal:any(
  5. TemplateRef(例如查询@ContentChild(TemplateRef(模板;(

在项目符号列表中,第三个项目符号显示"在当前组件的子组件树中定义的任何提供者(例如@ContentChild(SomeService(SomeService:SomeService(">。因此,在该示例中,LibCardHeader位于LibCardComponent的子组件树中,而LibrHeaderToken是在LibCardHeader中定义的提供程序,该提供程序是子组件,与解释";在当前组件的子组件树中定义的任何提供者";。当前组件是LibCardComponent

编辑:文档参考

最新更新