You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

Angular6项目出现ExpressionChangedAfterItHasBeenCheckedError错误求助

解决 Angular 6 中的 ExpressionChangedAfterItHasBeenCheckedError 错误

这个错误在Angular开发模式下特别常见,本质是Angular的变更检测机制在完成一轮检查后,发现组件绑定的属性值又发生了变化——就像你遇到的情况:父组件的eventoSelezionato初始值是空字符串'',在变更检测完成后又变成了null,导致子组件的flag输入属性前后值不一致,触发了Angular的开发模式校验。

下面给你几个可行的解决方案,按推荐程度排序:

1. 从根源统一初始值(最推荐)

既然最终eventoSelezionato会变成null,那直接在父组件里把它的初始值设为null,而不是空字符串。这样Angular两次变更检测时拿到的值一致,就不会报错了:

// 父组件TS代码
eventoSelezionato: any = null; // 替换原来的空字符串初始化

2. 手动触发变更检测(适合无法修改初始值的场景)

如果因为业务原因不能修改父组件的初始值,可以在子组件里利用ChangeDetectorRef手动通知Angular同步最新的属性值:

首先在子组件中注入ChangeDetectorRef,然后在ngOnChanges钩子中触发变更检测:

// 子组件TS代码
import { Component, Input, OnChanges, ChangeDetectorRef } from '@angular/core';

@Component({
  selector: 'app-repertorio',
  templateUrl: './repertorio.component.html'
})
export class RepertorioComponent implements OnChanges {
  @Input() flag: any;

  constructor(private cdr: ChangeDetectorRef) {}

  ngOnChanges() {
    // 让Angular重新检测组件状态,同步最新的flag值
    this.cdr.detectChanges();
  }
}

3. 延迟赋值(应急方案,不推荐)

这是一种hack式的解决办法,通过setTimeout把赋值操作放到下一个宏任务队列,避开Angular的变更检测周期:

// 父组件中给eventoSelezionato赋值的地方
setTimeout(() => {
  this.eventoSelezionato = null; // 或者你的目标值
});

不过这个方法可能会带来微小的延迟,而且不是从根源解决问题,所以尽量优先用前两种方案。

内容的提问来源于stack exchange,提问作者michelemalagnini

火山引擎 最新活动