0

嗨,我收到这个错误“表达式在检查后已更改”,但我的应用程序的行为是正确的。第一个问题是如果发生错误,为什么组件可以正常工作?

例如,我有 2 个兄弟组件,它们像这样使用它们:

<cmp-a (onSelectItem)="selectedItem = $event"></cmp-a>
<cmp-b [selectedItem]="selectedItem"></cmp-b>

当 cmp-a 中的 onSelectItem 发出时,我得到错误。但 selectedItem 正确传递给 cmp-b 并且一切都很好,还可以!

第二个问题是如果真的发生错误,为什么在 prod 模式下不通过角度框架显示此错误?

谢谢

4

1 回答 1

2

我希望这会帮助你。我不喜欢使用链接,因为它将来可能会损坏。因此,这是您需要了解的有关此类错误的信息。

一个正在运行的 Angular 应用程序是一个组件树。在变更检测期间,Angular 对每个组件进行检查,这些组件包括按指定顺序执行的以下操作:

  • 更新所有子组件/指令的绑定属性
  • 在所有子组件/指令上调用 ngOnInit、OnChanges 和 ngDoCheck 生命周期挂钩
  • 更新当前组件的 DOM
  • 为子组件运行更改检测
  • 为所有子组件/指令调用 ngAfterViewInit 生命周期钩子

在更改检测期间还执行其他操作。

在每次操作之后,Angular 都会记住它用来执行操作的值。它们存储在组件视图的 oldValues 属性中。在对所有组件进行检查后,Angular 会开始下一个摘要循环,但它不会执行上面列出的操作,而是将当前值与它从上一个摘要循环中记住的值进行比较:

  • 检查传递给子组件的值是否与现在用于更新这些组件的属性的值相同
  • 检查用于更新 DOM 元素的值是否与现在用于更新这些元素的值相同
  • 对所有子组件执行相同的检查

请注意,此附加检查仅在开发模式下执行。

第二个问题:似乎最近几乎每天都有关于 Angular 引发的 ExpressionChangedAfterItHasBeenCheckedError 错误的 stackoverflow 问题。通常出现这些问题是因为 Angular 开发人员不了解变更检测的工作原理以及为什么需要进行产生此错误的检查。许多开发人员甚至将其视为一个错误。但肯定不是。

你可以在标题中找到一个很好的例子:价值观变化的原因。 https://blog.angularindepth.com/everything-you-need-to-know-about-the-expressionchangedafterithasbeencheckederror-error-e3fd9ce7dbb4

于 2019-01-15T13:59:36.413 回答