angular - 组件更改自身时如何避免表达式 "changed after checked"错误

标签 angular error-handling angular6

我有一个需要处理 chrome 表单填充的下拉组件。换句话说,它应该切换到与表单填充值匹配的项目。

我让它工作,但匹配导致以下错误:

Error: ExpressionChangedAfterItHasBeenCheckedError: Expression has changed after it was checked. Previous value: 'null: {
  "name": "Testy McTester",
  "street": "14 15th Street",
  "city": "Cornfield",
  "state": ""
}'. Current value: 'null: {
  "name": "Testy McTester",
  "street": "14 15th Street",
  "city": "Cornfield",
  "state": "KS"
}'.

示例代码:https://stackblitz.com/edit/reactive-form-fill-dropdown

问题出在本节:

ngAfterViewChecked(): void {
  // Formfilling may have put a value into the input
  const nativeValue = this.inputField && this.inputField.nativeElement && this.inputField.nativeElement.value;
  if (nativeValue !== this.value) {
    const matchingOption = this.allStates.find(opts => opts && (opts.abbr === nativeValue || opts.name === nativeValue));
    if (matchingOption) {
      // This causes Changed after Checked Error
      this.writeValue(matchingOption.abbr);
    }
  }
  return;
}


让 Angular 知道组件已更改自身并且需要在更改后运行另一遍的推荐方法是什么?

搬家this.writeValue(matchingOption.abbr);在 setTimeout() 内部有效,但似乎是个坏主意。

最佳答案

所以你不应该调用writeValue里面 ngAfterViewChecked .从您的评论中您知道这是 Change after checked 的原因错误。

你可以做的是使用二传手:

 set value(val) {
    this._value = val;
    this.onChange(val);
  }

为了让 Angular 知道组件已经改变了自己,你可以在 上使用 2-way 绑定(bind)。值(value) 自定义下拉组件中的变量。
像:
 <input #input [id]="controlId" [(ngModel)]="value" type="text" style="border:none; outline:none"/>

现在它似乎工作了。
在这里查看:https://stackblitz.com/edit/reactive-form-fill-dropdown-2dzzzr

关于angular - 组件更改自身时如何避免表达式 "changed after checked"错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54991666/

相关文章:

angular - 如何将对象添加到数组的可观察对象

javascript - 错误无法读取 d3-甘特图中 null 的属性 'getBoundingClientRect'

javascript - Ionic 和 Angular 2 - 拒绝应用来自 'http://localhost:8100/build/main.css' 的样式,因为它的 MIME 类型 ('text/html' 不受支持

angular cli 6,ng测试不起作用

angular - 在 Angular 项目中放置类型/类的位置

angular - Ionic 4 - 如何使用 navCtrl 或 Router 服务在页面之间传递数据

xcode - 修复了 Xcode 难以辨认的内联错误突出显示?

r - 在 for 循环 R 中包括 try() 或 trycatch()

java - Java 中的错误处理 InputMismatchException

typescript - 如何在 Angular 6+ 的 mat-paginator 中更改 itemsPerPageLabel