对角度的脏检查

时间:2014-07-11 13:12:46

标签: javascript angularjs observer-pattern

我正在阅读一些文章,以了解 angular.js 的工作原理。

我不理解的一个条款是“脏检查”。

究竟是什么?它似乎是一个观察者模式,但显然它更好。

你能帮我理解一下吗?

提前致谢。

编辑:对于想要了解更多信息的人来说,这对于几年前在NgEurope this video swiip观看{{3}}非常有用

6 个答案:

答案 0 :(得分:53)

来自this link

  

Angular定义了一个所谓的摘要的概念   周期。这个循环可以被认为是一个循环,在此期间Angular   检查所有人观察到的所有变量是否有任何变化   $ scopes。因此,如果您在控制器中定义了$ scope.myVar   并且这个变量被标记为被观看,那么你就是   明确地告诉Angular监视myVar中的变化   迭代循环。

此“digest”也称为“脏检查”,因为在某种程度上,扫描更改范围。我不能说它是否比可观察的模式好或坏。这取决于你的需求。

一些链接:

答案 1 :(得分:19)

Angular Dirty Checking机制工作流程。

enter image description here

  

肮脏的检查是一个简单的过程,归结为一个非常基本的过程   概念:它检查值是否已更改尚未更改   在应用程序中同步。

     

我们的Angular应用程序会跟踪当前手表的值。   Angular走了下来   $ watch list,如果更新的值没有从旧更改   价值,它继续下去。如果值已更改,则应用程序   记录新值并继续按下$ watch列表。

Check out the whole article here

答案 2 :(得分:7)

什么是脏检查?

检查每个手表以检测更改的过程称为脏检查。可能有两种情况

首先 -

  1. 从列表中获取手表
  2. 检查项目是否已更改
  3. 如果项目没有变化,那么
  4. 未执行任何操作,转到监视列表中的下一项
  5. <强>二 -

    1. 从列表中获取手表
    2. 检查项目是否已更改
    3. 如果项目中有更改
    4. DOM需要更新,返回摘要循环
    5. 在第二种情况下,循环继续,直到它在整个循环中找不到任何变化。一旦完成,DOM将根据需要进行更新。

答案 3 :(得分:4)

只修改以前的答案......

Angular有一个'摘要周期'概念。您可以将其视为循环。 Angular检查所有$ scopes监视的所有变量是否有任何变化(内部$ watch()和$ apply()函数与$ scope 下定义的每个变量绑定)。

因此,如果您在控制器中定义了$ scope.myVar(这意味着此变量'myVar'被标记为正在观看),那么您明确告诉Angular在循环的每次迭代中监视'myVar'的变化。因此,当'myVar'的值发生变化时,每次$ watch()都会注意到并执行$ apply()来应用DOM中的更改。

此“摘要”也称为“脏检查”,因为在某种程度上,它会扫描范围以进行更改。由于所有观察变量都在一个循环中(摘要循环),任何变量的任何值变化都会强制重新分配DOM中其他监视变量的值。

PROS:这是Angular实现双向数据绑定的方式。

缺点:如果单个页面中有更多观看的变量(&gt; 2000-3000),您可能会在页面加载时看到延迟。(但我说如果有很多'观察到的变量'在一个页面中,这是一个糟糕的页面设计:p)。

还有其他缺点,也有解决方法:D

答案 4 :(得分:2)

我在this blog post读了很多关于脏检查的文章。还有这个SO answer

<强> TLDR;版本

当$ digest循环开始时,观察者将检查范围模型中的任何变化,如果有任何变化(变化可能也来自Angular-domain之外),则执行相应的侦听器函数。这将再次运行$ digest循环并检查范围模型是否已更改(侦听器函数也可以修改范围模型)。

总的来说,即使监听器没有更改模型或直到达到10的最大循环次数,$ digest循环也会运行两次。

答案 5 :(得分:1)

肮脏的检查 将检查$ scope变量中的任何更改并将其更新到DOM。 这由角度js完成,你也可以自己实现脏检查。