javascript - Angular 5:获取所有 ContentChildren 的 QueryList(甚至是子组件中的)
问题描述
我有以下 html 结构,其中foo
和bar
是两个指令,并且baz
是自定义组件。
<div foo>
<div bar></div>
<baz><baz>
<baz><baz>
</div>
-component的 htmlbaz
看起来像...
<div bar>Yada Yada Yada</div>
...并且foo
-directive 看起来像这样:
// ...
@Directive({
selector: '[foo]'
})
export class FooDirective implements AfterContentInit {
@ContentChildren(BarDirective)
m_bars: QueryList<BarDirective>;
public ngAfterContentInit(): void {
console.log('barCount:', this.m_bars.length);
}
}
我遇到的问题是m_bars
内部的长度FooDirective
是 1。它只包含 的div
直接子级<div foo>
。然而,我希望这个数字是 3 (一个直接的孩子<div foo>
和另一个div
在两个 - 组件内baz
)。
为什么会这样?如何解决这个问题——如果可以解决的话?
编辑 1:将ContentChildren
装饰器更改为
@ContentChildren(BarDirective, { descendants: true })
m_bars: QueryList<BarDirective>;
根本没有任何作用。
解决方案
这是不可能的,这很糟糕。有关详细信息,请参阅https://github.com/angular/angular/issues/20810#issuecomment-401341413。我将引用 tl;dr 版本以供参考:
简而言之:我们只查询组件自己的内容,而不是来自其他模板的内容。这是有道理的,因为一个模板在一个模板中形成一个命名空间 #foo 可能意味着一件事,而在另一个模板中则完全不同。名称可能相同,但含义却大不相同。