我正在阅读一些文章,以了解 angular.js 的工作原理。
我不理解的一个条款是“脏检查”。
究竟是什么?它似乎是一个观察者模式,但显然它更好。
你能帮我理解一下吗?
提前致谢。
编辑:对于想要了解更多信息的人来说,这对于几年前在NgEurope this video swiip观看{{3}}非常有用
答案 0 :(得分:53)
来自this link:
Angular定义了一个所谓的摘要的概念 周期。这个循环可以被认为是一个循环,在此期间Angular 检查所有人观察到的所有变量是否有任何变化 $ scopes。因此,如果您在控制器中定义了$ scope.myVar 并且这个变量被标记为被观看,那么你就是 明确地告诉Angular监视myVar中的变化 迭代循环。
此“digest
”也称为“脏检查”,因为在某种程度上,扫描更改范围。我不能说它是否比可观察的模式好或坏。这取决于你的需求。
一些链接:
答案 1 :(得分:19)
Angular Dirty Checking机制工作流程。
肮脏的检查是一个简单的过程,归结为一个非常基本的过程 概念:它检查值是否已更改尚未更改 在应用程序中同步。
我们的Angular应用程序会跟踪当前手表的值。 Angular走了下来 $ watch list,如果更新的值没有从旧更改 价值,它继续下去。如果值已更改,则应用程序 记录新值并继续按下$ watch列表。
答案 2 :(得分:7)
什么是脏检查?
检查每个手表以检测更改的过程称为脏检查。可能有两种情况
首先 -
<强>二 - 强>
在第二种情况下,循环继续,直到它在整个循环中找不到任何变化。一旦完成,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完成,你也可以自己实现脏检查。