48

我现在读了很多关于 AngularJS 的文章,我遇到了那个神奇的 $watch 函数。我了解如何使用它,但我想知道它是如何在后台实现的。它是一个时间间隔函数吗?还是 Angular 每执行一条语句都会调用这个手表?

我现在不想深入研究源代码,如果你们中的一个人已经知道答案并想分享他对该主题的知识,我会很高兴。

谢谢。

4

1 回答 1

77

每个摘要循环都会评估(有时多次)所有手表。由于某些事件或调用 $apply() 而进入摘要循环。手表不会根据计时器定期调用。

请参阅https://docs.angularjs.org/guide/scope#integration-with-the-browser-event-loop

浏览器的事件循环等待事件到达。事件的回调被执行...一旦回调执行,浏览器就会离开 JavaScript 上下文并根据 DOM 更改重新呈现视图。Angular 通过提供自己的事件处理循环来修改正常的 JavaScript 流程。这将 JavaScript 拆分为经典和 Angular 执行上下文...... Angular 执行 [一些]stimulusFn(),它通常会修改应用程序状态。Angular 进入 $digest 循环。该循环由两个较小的循环组成,它们处理 $evalAsync 队列和 $watch 列表。$digest 循环不断迭代,直到模型稳定,这意味着 $evalAsync 队列为空,$watch 列表没有检测到任何变化。$watch 列表是一组自上次迭代以来可能已更改的表达式。

在此处输入图像描述

于 2013-09-05T14:30:00.820 回答