【发布时间】:2014-09-02 03:09:30
【问题描述】:
我正在阅读一些文章以进一步了解 AngularJS 的工作原理。
我不明白的一个术语是Dirty Checking。
究竟是什么?它看起来像观察者模式,但显然它更好。
你能帮我理解一下吗?
编辑:几年前在 NgEurope 从swiip 观看this video 对想要了解更多信息的人也很有用。
【问题讨论】:
标签: javascript angularjs observer-pattern
我正在阅读一些文章以进一步了解 AngularJS 的工作原理。
我不明白的一个术语是Dirty Checking。
究竟是什么?它看起来像观察者模式,但显然它更好。
你能帮我理解一下吗?
编辑:几年前在 NgEurope 从swiip 观看this video 对想要了解更多信息的人也很有用。
【问题讨论】:
标签: javascript angularjs observer-pattern
来自this link:
Angular 定义了一个所谓的摘要的概念 循环。这个循环可以认为是一个循环,在这个循环中,Angular 检查所有人监视的所有变量是否有任何变化 $范围。因此,如果您在控制器中定义了 $scope.myVar 并且这个变量被标记为被监视,那么你就是 明确告诉 Angular 监控 myVar 在每个 循环的迭代。
此“digest”也称为“脏检查”,因为在某种程度上,它扫描更改范围。我不能说它是否比可观察模式更好或更坏。这取决于您的需求。
部分链接:
【讨论】:
Angular 脏检查机制工作流程。
脏检查是一个简单的过程,归结为一个非常基本的过程 概念:它检查一个尚未更改的值是否已更改 跨应用同步。
我们的 Angular 应用会跟踪当前手表的值。 Angular 走下 $watch 列表,并且,如果更新的值没有从旧的改变 值,它继续向下列表。如果值已更改,则应用程序 记录新值并继续向下 $watch 列表。
【讨论】:
什么是脏检查?
检查每个手表以检测更改的过程称为脏检查。可能有两种情况
第一——
第二——
在第二种情况下,循环继续,直到在整个循环中没有发现任何变化。一旦完成,DOM 会根据需要进行更新。
【讨论】:
只是修改以前的答案...
Angular 有一个“消化循环”的概念。您可以将其视为一个循环。其中 Angular 检查所有 $scopes 监视的所有变量是否有任何更改(在内部,$watch() 和 $apply() 函数正在与 $scope 下定义的每个变量绑定) .
所以如果你在你的控制器中定义了$scope.myVar(这意味着这个变量myVar被标记为被监视)那么你就明确地告诉Angular在循环的每次迭代中监控myVar的变化。所以当myVar的值发生变化时,每次$watch()通知并执行$apply()以应用DOM中的变化。
这种“摘要”也称为“脏检查”,因为在某种程度上,它会扫描范围以查找更改。由于所有监视变量都在一个循环(摘要循环)中,因此任何变量的任何值更改都会强制重新分配 DOM 中其他监视变量的值。
优点:这是 Angular 实现双向数据绑定的方式。
缺点:如果单个页面中有更多观察变量 (>2000–3000),您可能会在页面加载时看到延迟。 (但我说如果一个页面中有那么多“观察变量”,那就是糟糕的页面设计:p)。
还有其他缺点,以及解决方法:D
【讨论】:
脏检查 将检查 $scope 变量中的任何更改并将其更新到 DOM。 这个是angular js完成的,你也可以自己实现脏检查。
【讨论】:
我在this blog post 中阅读了一篇关于脏检查的精彩文章。还有这个SO answer
TLDR;版本
当 $digest 循环开始时,观察者将检查作用域模型中的任何更改,如果有任何更改(更改也可能来自 Angular 域外),则执行相应的监听器函数。这将再次运行 $digest 循环并检查范围模型是否已更改(侦听器函数也可以修改范围模型)。
总体而言,$digest 循环将运行两次,即使侦听器没有更改模型或直到它达到最大循环计数 10。
【讨论】: