在prodMode中更改检测角度

时间:2019-01-15 13:45:53

标签: angular angular7 angular-changedetection

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

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

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

当cmp-a中的onSelectItem发出时,我得到了错误。但是selectedItem正确地传递给了cmp-b,所有的东西都很好,还可以!!!

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

谢谢

1 个答案:

答案 0 :(得分:2)

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

正在运行的Angular应用程序是一棵组件树。在进行变更检测期间,Angular会检查每个组件,其中每个组件都包含以指定顺序执行的以下操作:

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

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

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

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

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

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

您可以在标题处找到一个很好的示例:值的原因发生变化。 https://blog.angularindepth.com/everything-you-need-to-know-about-the-expressionchangedafterithasbeencheckederror-error-e3fd9ce7dbb4