好答案。但是,在我使用 ChangeDetectorRef 和 AfterViewInit 时,似乎 Angular 会进入几个额外的渲染周期,如果我的 HTML 代码没有经过非常好的设计或需要多次调用依赖于刷新的 TS 代码函数,我会收到额外的视图渲染调用,因此会有额外的处理。
这里是一个我喜欢使用的解决方案,因为我不必担心任何这些问题,它在程序上非常简单,而且对我或系统的要求也不需要太多。无论何时 Angular 给我带来困扰,出现臭名昭著的错误:“检查后表达式已更改”,我都可以毫不费力地使用它。
我有这个小公共/导出函数,它只是通过一个零延迟 Promise 传递我的值。这样做的效果是,它强制 JavaScript/JS 进入另一个后台循环,从而将值更新分离到下一个处理周期,并防止出现错误。(请注意,JS 循环与 Angular HTML 视图渲染循环不同,并且处理强度较小)。
export async function delayValue(v: any, timeOutMs: number = 0): Promise<any> {
return new Promise((resolve) => {
setTimeout(() => {
resolve(v);
}, timeOutMs);
});
}
现在,当我需要防止错误时,我只需执行以下操作:
this.myClassValue = await delayValue(newValue)
这只是一行代码。由于timeOutMs的值为0,因此实际上没有明显的延迟。
以下是一个典型的场景:
myObservable$.subscribe(newValue = {
...
this.handleSubscribedValues(newValue);
...
});
private handleSubscribedValues(newValue) {
this.myClassValue = newValue;
}
private async handleSubscribedValues(newValue) {
this.myClassValue = await delayValue(newValue);
}
如果您需要等待某些事件发生,例如让用户有几秒钟的时间,您还可以使用delayValue()函数和一些延迟/超时值。
希望这对您中的一些人有所帮助。
ExpressionChangedAfterItHasBeenCheckedError
错误,你需要了解的一切 详细地解释了其行为。 - Max KoretskyidetectChanges()
时修改您的ChangeDetectionStrategy
。https://dev59.com/JlkS5IYBdhLWcg3we22Z#54954374 - luiscla27