首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Angular - ExpressionChangedAfterItHasBeenCheckedError on binding

Angular - ExpressionChangedAfterItHasBeenCheckedError on binding
EN

Stack Overflow用户
提问于 2017-06-06 16:48:05
回答 1查看 466关注 0票数 1

我有一个<input>字段和一个组件,它们绑定了一个公共模型。我在组件中使用ngOnChanges()来检查该输入的值,并且我还在此组件中的某处更改绑定到该输入的模型。

假设我们将date变量绑定到<input>和组件。在这种情况下会出现错误:

代码语言:javascript
复制
input field changed (also date changed) 
--> ngOnChanges 
--> new value of date doesn't fit requirements 
--> change the date to something else
--> <input> emits the new date
--> ngOnChanges() triggered again
--> ExpressionChangedAfterItHasBeenCheckedError

下面是我的部分代码:

app.component.html

代码语言:javascript
复制
...
<input [(ngModel)]="date">
<app-date-picker [date]="date" (dateUpdated)="setDate($event)"></app-date-picker>
...

app.component.ts

代码语言:javascript
复制
setDate(newDate: Date): void {
  this.date = newDate.toISOString().split('T')[0];
}

date-picker.component.ts

代码语言:javascript
复制
  ngOnChanges(changes: SimpleChanges): void {
    if (changes.date) ... // Do some checks
    if (invalidDate) {
       ...
       this.select(newDay);
    }
  }

  select(d: number): void {
    this.selectedYear = this.year;
    this.selectedMonth = this.month;
    this.selectedDay = this.day = d;
    this.dateUpdated.emit(new Date(this.year, this.month, this.day + 1));
  }
EN

回答 1

Stack Overflow用户

发布于 2017-06-06 20:50:09

我通过使用超时更改日期来解决这个问题:

代码语言:javascript
复制
ngOnChanges(changes: SimpleChanges): void {
  if (changes.date) ... // Do some checks
  if (invalidDate) {
     ...
     setTimeout(() => { select(newDay); }, 50);
  }
}
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/44385421

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档