我现在正在阅读很多关于AngularJS的内容,而且我遇到了那个神奇的$ watch功能。我理解如何使用它,但我想知道它是如何在后台实现的。它是时间间隔功能吗?或者是Angular在每次执行声明时都会调用此表吗?
我现在不想深入研究源代码,如果你们中的一个人已经知道答案并想分享他对这个主题的了解,我会很高兴。
感谢。
答案 0 :(得分:76)
每个消化循环都会评估(有时多次)所有手表。摘要循环是作为某个事件的结果输入的,或者调用$ apply()。手表不会根据计时器定期调用。
请参阅https://docs.angularjs.org/guide/scope#integration-with-the-browser-event-loop
浏览器的事件循环等待事件到达。事件的回调被执行...一旦回调执行,浏览器就会离开JavaScript上下文并根据DOM更改重新呈现视图。 Angular通过提供自己的事件处理循环来修改正常的JavaScript流。这将JavaScript分为经典和Angular执行上下文...... Angular执行[some] stimulusFn(),它通常会修改应用程序状态。 Angular进入$ digest循环。循环由两个较小的循环组成,它们处理$ evalAsync队列和$ watch列表。 $ digest循环不断迭代,直到模型稳定,这意味着$ evalAsync队列为空,$ watch列表未检测到任何更改。 $ watch列表是一组表达式,自上次迭代后可能已更改。如果检测到更改,则调用$ watch函数,该函数通常使用新值更新DOM。