我想使用ViewChildren
中的QueryList
做TemplateRef
,但不能传递给输入组件。
例如
Component.ts:
@ViewChildren(TemplateRef) cellTemplates: QueryList<TemplateRef<any>>;
查看:
<my-component [templatesRef]="cellTemplates"></my-component>
输入:
_templatesRef;
@Input()
set templatesRef(refs: any) {
this._templatesRef = refs;
}
ExpressionChangedAfterItHasBeenCheckedError:表达式已更改 经过检查后。先前的值:'ngIf:false'。当前值: 'ngIf:true'。
答案 0 :(得分:2)
从模板获取cellTemplates后,您应强制父级检测更改,因此请尝试在父级中使用ChangeDetectorRef:
export class AppComponent {
name = 'Angular';
@ViewChildren(TemplateRef, {read: TemplateRef}) cellTemplates: QueryList<TemplateRef<any>>;
constructor(private cd: ChangeDetectorRef) { }
ngOnInit(){ }
ngAfterViewInit(){
this.cd.detectChanges();
}
}
您可以在此article中找到有关该异常的详细说明。
答案 1 :(得分:2)
在您的应用程序组件中有一个丑陋的解决方法
export class AppComponent implements AfterViewInit {
yet=false;
ngAfterViewInit()
{
setTimeout(()=>{
this.yet=true
})
}
}
在afterViewInit之后执行并使用setTimeout
{{1}}
问题在于,首先cellTemplates是一个空查询,而afterViewInit获取元素
答案 2 :(得分:0)
为什么不使用您创建的视图变量?
<my-component [templatesRef]="title"></my-component>
<ng-template #title>
ok
</ng-template>
答案 3 :(得分:0)
另一种不使用ChangeDetectorRef
和setTimeout
的解决方案。
@ViewChildren(TemplateRef, {read: TemplateRef})
set cellTemplates(refs: QueryList<TemplateRef<any>>) {
this._cellTemplates = refs;
}