2

我有一个组件的 Input 属性,如果当前数据未定义,我应该只显示。

我正在使用 ngOnChanges 来检测更改,但它会引发“ ExpressionChangedAfterItHasBeenCheckedError ”错误。

这是代码,

  ngOnChanges(changes: { [propName: string]: SimpleChange}) {
if (changes['message'].currentValue) {
  this.open();
}}


open() {
    let config = new MatSnackBarConfig();
    config.verticalPosition = this.verticalPosition;
    config.horizontalPosition = this.horizontalPosition;
    config.duration = this.setAutoHide ? this.autoHide : 0;
    config.extraClasses = this.addExtraClass ? ['test'] : undefined;
    this.snackBar.open(this.message, this.action ? this.actionButtonLabel : undefined, config);
}

Stackblitz 链接:https ://stackblitz.com/edit/angular-snackbar-top-bdmsmz

有什么办法可以解决这个错误。

Stackblitz 错误信息

4

2 回答 2

2

错误以这种方式发生:

    ngOnChanges(changes: { [propName: string]: SimpleChange}) {
        setTimeout(()=>{
      if (changes['message'].currentValue) {
          this.open();
        }
        })
      }
于 2018-11-03T00:04:20.517 回答
1

这是与 Angular 的生命周期事件相关的问题。

解决它的一种快速方法是将行为不端的代码(在本例中是snackBar.open调用)包装在一个setTimeout函数中

setTimeout(()=>{
  this.snackBar.open(this.message, this.action ? this.actionButtonLabel : undefined, config);
})

演示

于 2018-11-03T00:03:11.897 回答