Angular 4:`ExpressionChangedAfterItHasBeenCheckedError:表达式在检查后发生了变化

Nic*_*las 15 eventemitter typescript angular

我的子模块中的每个EventEmiiter都会出现此错误,但我无法找到解决方法.

ExpressionChangedAfterItHasBeenCheckedError: Expression has changed after it was checked. Previous value: 'true'. Current value: 'false'.

这是触发我的EventEmitter的原因:

ngOnChanges(changes: any) {
    if (changes.groupingTabValid) {
        if (changes.groupingTabValid.currentValue !== changes.groupingTabValid.previousValue) {
            this.groupingTabValidChange.emit(this.groupingTabValid);
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

这是我的"主要"组件的HTML

<year-overview-grouping [definitionDetails]="definitionDetails"
                        [fixedData]="fixedData"
                        [showValidation]="showValidation"
                        [groupingTabValid]="groupingTabValid"
                        (groupingTabValidChange)="setValidators('groupingTab', $event)">

</year-overview-grouping>
Run Code Online (Sandbox Code Playgroud)

哪个叫这个功能

public setValidators(validator: string, e: boolean) {
    switch (validator) {
        case "groupingTab":             
            this.groupingTabValid = e;
            break;

        case "selectionTab":
            this.selectionTabValid = e;
            break;
    }

    if (this.groupingTabValid && this.selectionTabValid) {
        this.valid = true;
    } else {
        this.valid = false;
    }
}
Run Code Online (Sandbox Code Playgroud)

1)在一个简单的解释中,是什么导致了这个错误?

2)我可以采取哪些措施来解决这个问题?

小智 11

遵守单向数据流规则

尝试使用setTimeout将调用推迟一个tick

if (changes.groupingTabValid.currentValue !== changes.groupingTabValid.previousValue) {
    setTimeout(() => this.groupingTabValidChange.emit(this.groupingTabValid), 0)
}
Run Code Online (Sandbox Code Playgroud)

  • 这真的是最好的解决方案吗?我现在已经在一些地方看到了这个解决方案,这感觉就像一个解决方案. (8认同)