从官方文档中,以下是启用树抖动的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装饰器的定义,它是在原始文档中编写的:
支持以下选择器。
- 任何带有@Component或@Directive装饰器的类
- 作为字符串的模板引用变量(例如查询<我的组件#cmp>带有@ContentChild('cp'((
- 当前组件的子组件树中定义的任何提供程序组件(例如@ContentChild(SomeService(SomeService:SomeService(
- 通过字符串令牌定义的任何提供者(例如。@ContentChild('someToken'(someTokenVal:any(
- TemplateRef(例如查询@ContentChild(TemplateRef(模板;(
在项目符号列表中,第三个项目符号显示"在当前组件的子组件树中定义的任何提供者(例如@ContentChild(SomeService(SomeService:SomeService(">。因此,在该示例中,LibCardHeader位于LibCardComponent的子组件树中,而LibrHeaderToken是在LibCardHeader中定义的提供程序,该提供程序是子组件,与解释";在当前组件的子组件树中定义的任何提供者";。当前组件是LibCardComponent。
编辑:文档参考