Angular 4 错误:检查后表达式已更改

Posted

技术标签:

【中文标题】Angular 4 错误:检查后表达式已更改【英文标题】:Angular 4 Error: Expression has changed after it was checked 【发布时间】:2018-05-11 20:15:59 【问题描述】:

我在我的 Angular 4 应用程序中使用 Angular Material。当我尝试在ngAfterViewInit() 中使用MatSnackBar 时,我遇到以下错误:

ExpressionChangedAfterItHasBeenCheckedError:表达式已更改 检查后。以前的值:'未定义'。当前值: 'visible-bottom'。似乎视图是在其父级及其子级经过脏检查后创建的。它是在变更检测钩子中创建的吗?

我已经使用ChangeDetectorRef 来检测更改,但它似乎不起作用。

这是我一直在处理的代码:

   constructor(private matSnackBar: MatSnackBar, private router: Router, private cdr: ChangeDetectorRef)  

   ngOnInit() 

   ngAfterViewInit() 
    let snackBarRef = this.matSnackBar.open('Redirecting to dashboard..', 'Cancel', 
      duration: 10000
    );

    snackBarRef.onAction().subscribe(() => 
      console.log("Cancelled");
    );


    this.cdr.detectChanges();
  

请帮我解决这个问题。

【问题讨论】:

您是否尝试在onAction().subscribe(() => ); 内移动this.cdr.detectChanges(); @AmitChigadani 这行不通! 尝试创建一个工作的 plunker 来复制错误。提供的代码不会有太大帮助。 【参考方案1】:

尝试在你的构造函数中移动snackbar:

constructor(private matSnackBar: MatSnackBar, private router: Router, private cdr: ChangeDetectorRef) 
  let snackBarRef = this.matSnackBar.open('Redirecting to dashboard..', 'Cancel', 
    duration: 10000
  );
  snackBarRef.onAction().subscribe(() => 
    console.log("Cancelled");
  );

【讨论】:

【参考方案2】:

一个潜在但粗略的解决方案是使用 setTimeout -

let snackBarRef;
setTimeout(() => 
    snackBarRef = this.matSnackBar.open('Redirecting to dashboard..', 'Cancel', 
      duration: 10000
    );
);

请参考https://github.com/angular/material2/issues/6158了解更多信息。

【讨论】:

我已经这样做了。它有效,但我正在寻找检测这些变化的 Angular 方法。 @ProtonStarlight,我试图找出不感兴趣的方法,我发现了 2 种可能的方法,如下所示 - 1. 要使用 ngAfterContentInit 而不是 ngAfterViewInit,请参考 - angular.io/guide/… 2. To在DetectChanges方法之前/结合使用ChangeDetectorRef的分离方法。请注意,我没有亲自使用过这些,但我认为这些可能会有所帮助。 @ProtonStarlight,你有机会查看我的评论吗? 但是AfterContentInit 初始化一个甚至不存在视图的可视元素还为时过早。

以上是关于Angular 4 错误:检查后表达式已更改的主要内容,如果未能解决你的问题,请参考以下文章

Angular 2 模态弹出错误“检查后表达式已更改”

如何在 Angular 2 上实现 ngOnChanges 以进行输入验证,而不触发“检查后表达式已更改。”错误

ERROR 错误:ExpressionChangedAfterItHasBeenCheckedError:表达式在检查后已更改

Angular 2 方式绑定组件 - 检查后表达式已更改

Angular 2 - 日期管道异常:检查后表达式已更改

Angular2:嵌套 *ngFor 导致“检查后表达式已更改”