带有templateRef

时间:2019-10-08 07:02:37

标签: angular dom angular8 viewchild

我想使用ViewChildren中的QueryListTemplateRef,但不能传递给输入组件。

例如

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'。

参见Stackbilitz

4 个答案:

答案 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中找到有关该异常的详细说明。

DEMO ??

答案 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)

另一种不使用ChangeDetectorRefsetTimeout的解决方案。

@ViewChildren(TemplateRef, {read: TemplateRef})
set cellTemplates(refs: QueryList<TemplateRef<any>>) {
    this._cellTemplates = refs;
}