Javascript “如何调试”;表达式在被选中后已更改";错误?

Javascript “如何调试”;表达式在被选中后已更改";错误?,javascript,angular,typescript,debugging,angular2-changedetection,Javascript,Angular,Typescript,Debugging,Angular2 Changedetection,这是一个臭名昭著的错误,在开发人员中有相当多的“追随者”,但众所周知,调试起来也相当棘手。原木是这样的 PersonalSituationComponent.html:3 ERROR Error: ExpressionChangedAfterItHasBeenCheckedError: Expression has changed after it was checked. Previous value: 'true'. Current value: 'false'. at viewDebugE

这是一个臭名昭著的错误,在开发人员中有相当多的“追随者”,但众所周知,调试起来也相当棘手。原木是这样的

PersonalSituationComponent.html:3 ERROR Error: ExpressionChangedAfterItHasBeenCheckedError: Expression has changed after it was checked. Previous value: 'true'. Current value: 'false'.
at viewDebugError (core.es5.js:8434) [angular]
at expressionChangedAfterItHasBeenCheckedError (core.es5.js:8412) [angular]
at checkBindingNoChanges (core.es5.js:8576) [angular]
at checkNoChangesNodeInline (core.es5.js:12455) [angular]
at checkNoChangesNode (core.es5.js:12429) [angular]
at debugCheckNoChangesNode (core.es5.js:13209) [angular]
at debugCheckRenderNodeFn (core.es5.js:13149) [angular]
at Object.eval [as updateRenderer] (PersonalSituationComponent.html:3) [angular]
at Object.debugUpdateRenderer [as updateRenderer] (core.es5.js:13131) [angular]
at checkNoChangesView (core.es5.js:12251) [angular]
at callViewAction (core.es5.js:12618) [angular]
at execEmbeddedViewsAction (core.es5.js:12596) [angular]
at checkNoChangesView (core.es5.js:12250) [angular]
at callViewAction (core.es5.js:12618) [angular]
这真的没有帮助。如果你在html的第3行做了很多事情,那么这一行没有布尔值,但是它是一个组件的开始标记,在不同的地方有一些布尔值(.ts和.html)


在不使用硬编码值替换所有布尔值并分别检查每个布尔值的情况下,如何调试此类错误?(当您键入时,我将这样做)。

您可以对组件中怀疑的变量值更改运行手动更改检测,直到错误得到解决。一旦找到它,您就可以决定是重新设计实现,还是只运行手动更改检测

import { ChangeDetectorRef } from '@angular/core';

constructor(private _cdRef: ChangeDetectorRef) { }

this._cdRef.detectChanges();

有很多帖子展示了如何找出“ExpressionChangedTerithasBeenCheckedError”错误,然而,阅读本文是一个很好的起点,以了解此错误的含义:

但是,如果你只是想用一种懒散的方式来解决这个问题,那么就开始评论一些事情,找出导致这个错误的罪魁祸首。一旦你分离出引起错误的那一行,然后可能会再次发布具体的错误“当我有这一行时,我就会得到这个错误”等等。我们可能会更好地帮助你

如果您仍然不想这样做,那么一旦发现有问题的代码,就尝试社区通常推荐的一些方法:

  • 用setTimeout包装您的代码(这只是一个hack)
  • 运行变更检测,如@Milo在另一个回答中所述
  • 确保正确销毁了子元素
有很多关于这个错误的帖子,如果你再努力一点,让我们对你的代码有一个更好的了解,那么我们可能会更好地帮助你


祝你好运!:)

您必须进行真正的调试,因为当前angular没有提供任何有意义的细节,除了值


若您在所有错误上设置了调试器选项break,您将能够遍历堆栈(有点明显,对吗?),并查看出现问题的组件名称。

投票支持(但未看到)详细文章。:)我现在在core.es5.js的第8406行,就在抛出错误之前,并试图从那里返回。到目前为止最奇怪的事情是,组件使用的大多数布尔值都是getter,它应该自己触发ChangeDetection,对吗?…:/嗯,这正是我现在正在做的。我已经找到了所有发生的方法(在控制器中),但是changeDetectorRef.detectChanges()没有帮助。但这是另一种情况。您应该能够找到组件名称,然后可以更容易地猜测哪个绑定导致错误。看,我知道这是一个旧线程,但我发现调试这是最好的。