來自官方檔案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在尋找提供者時也會被搜索呢?
uj5u.com熱心網友回復:
如果您查找@Contentchild裝飾器的定義,它會寫在原始檔案中:
支持以下選擇器。
- 任何帶有 @Component 或 @Directive 裝飾器的類
- 作為字串的模板參考變數(例如,使用 @ContentChild('cmp') 查詢 <my-component #cmp>)
- 當前組件的子組件樹中定義的任何提供者(例如@ContentChild(SomeService) someService: SomeService)
- 通過字串標記定義的任何提供者(例如 @ContentChild('someToken') someTokenVal: any)
- 一個 TemplateRef(例如使用 @ContentChild(TemplateRef) 模板查詢;)
在專案符號串列中,第 3 個專案符號表示“在當前組件的子組件樹中定義的任何提供程式(例如 @ContentChild(SomeService) someService: SomeService)”。因此,在示例中,LibCardHeader位于 LibCardComponent 的子組件樹中,而LibHeaderToken是定義在 LibCardHeader 中的提供程式-它是子組件 - 與“當前組件的子組件樹中定義的任何提供程式”的解釋相匹配. 當前組件是LibCardComponent。
編輯:檔案參考
轉載請註明出處,本文鏈接:https://www.uj5u.com/qianduan/437539.html
