我正在尝试控制组件的子实例,并且无法通过错误。我想跟随this issue的答案。
父组件Sequence
包含SequenceStep
的子组件。父级包含以下声明:
@ViewChildren(SequenceStep) steps: QueryList<SequenceStep>;
然后我想对孩子们做点什么:
ngAfterViewInit() {
this.steps.changes.subscribe(steps => {
console.log(steps);
});
}
我得到的错误是:
metadata_resolver.js:639未捕获错误:无法构建查询 财产&#34;步骤&#34; &#34;序列&#34;因为查询选择器不是 定义
而Sequence
和SequenceStep
组件的@Component
装饰器(sequence
和sequence-step
分别定义了选择器。)
我在这里做错了什么?
答案 0 :(得分:2)
您是否尝试过向@ViewChildren arg添加引号?
@ViewChildren('SequenceStep') steps: QueryList<SequenceStep>;
答案 1 :(得分:1)
有一些事情
如果你从外面传递孩子,他们满足而不是孩子。 @ViewChild()
仅适用于直接添加到组件模板中的子项。
@ContentChildren()
适用于已转化的内容:
@ContentChildren(TheChild) kids: QueryList<TheChild>;
this.kids.changes()
仅在初始化后通知有关更改。
因此,只需直接在this.kids
中访问ngAfterViewInit()
然后再获取以获取有关以后更改的通知
ngAfterViewInit() {
this.myKidsCount = this.kids.length;
this.cdRef.detectChanges();
this.kids.changes.subscribe(kids => {
this.myKidsCount = kids.length;
});
}
当变更检测导致变化时,Angular不喜欢。变更检测会调用ngAfterViewInit()
,这就是this.myKidsCount = this.kids.length
导致异常的原因。
要解决此问题,我在更改属性myKidsCount
后显式调用更改检测:
constructor(private cdRef:ChangeDetectorRef){}
ngAfterViewInit() {
this.myKidsCount = this.kids.length;
this.cdRef.detectChanges();
}
答案 2 :(得分:1)
此问题可能与SequenceStep的导入有关,请检查相关导入行的类名。
答案 3 :(得分:0)
@ViewChildren('SequenceStep') steps: QueryList<SequenceStep>;
为我工作。 Angular 4.X.X Angular CLI 1.X.X