代码之家  ›  专栏  ›  技术社区  ›  poojagupta

角度组件表达式中的Mat对话框错误changedafterithasbeencheckederror

  •  5
  • poojagupta  · 技术社区  · 6 年前

    我使用的是角6的角度材料,它就像在ngOnInit上,我必须显示内容,如果条件是正确的。

    我有一个对话框模块用来显示对话框

      `if (!this.checkforRestriction()) {
      this.loadContent(this.ReferenceID);
    } else {
      this.dialogService.okmessage('', dialogMessage);
    }` 
    

    错误错误:ExpressionChangedAfterItHasBeenCheckedError:表达式在检查后已更改。上一个值:“id:未定义”。当前值:“id:mat-dialog-0”。视图似乎是在其父视图和子视图被脏检查之后创建的。它是在变更检测钩子中创建的吗? 在viewDebugError(core.js:8445)

    我发现了这个错误。 请提出什么问题?

    1 回复  |  直到 6 年前
        1
  •  14
  •   Tomasz Kula    6 年前

    如果不知道所有调用函数的详细信息,很难判断是什么导致了问题。但是,表达式changedafterithasbeencheckederror很可能可以通过执行以下操作来修复:

    • 尝试将代码移到ngAfterViewInit生命周期挂钩中,
    • 尝试在setTimeout内包装代码。

    最后,阅读 Everything you need to know about the ExpressionChangedAfterItHasBeenCheckedError error . 它应该能让你更好地了解你所面临的错误。

        2
  •  1
  •   Simon_Weaver    6 年前

    我遇到了同样的潜在问题,错误如下:

    ExpressionChangedAfterItHasBeenCheckedError:表达式已更改 检查之后。上一个值:“aria labelledby:null”。当前 value:'aria labelledby:mat-dialog-title-0'

    我的对话框包含此标题指令:

    <h1 mat-dialog-title>{{ model.title }}</h1>
    

    Angular尝试应用 aria-labelledby 属性设置为对话框组件的父容器(mat dialog container)。如果从http加载在回调中打开对话框,则无法执行此操作。

    在我的例子中,我是作为RxJS“管道”的一部分打开对话框并添加 delay(0) 在http get有效地执行“setTimeout”之后。

    如。

    const result = this.http.get(...).pipe(
                                           delay(0), 
                                           switchMap(response => {
    
       if (response.hasOverdueLibraryBook) {
    
           return this.dialogManager.openOverdueLibraryBookDialog();  // this is a mat-dialog
       }
       else 
       {
          return of(false);
       }
    
    });