肮脏的angular度检查
我正在阅读一些文章,以更多地了解angular.js是如何工作的。
我不明白的一个术语是“ 脏检查 ”。
究竟是什么? 这看起来像是一个观察者模式,但显然它更好。
你能帮我理解这个吗?
提前致谢。
编辑:它也可以是有用的人想要了解更多关于从几年前在NgEurope swiip观看这个video
从这个链接 :
Angular定义了一个所谓的摘要循环的概念。 这个循环可以被认为是一个循环,在这个循环中,Angular检查所有$ scopes所监视的variables是否有变化。 所以,如果你的控制器中定义了$ scope.myVar,并且这个variables被标记为被监视,那么你明确地告诉Angular在循环的每次迭代中监视myVar的变化。
这个“ digest
”也被称为“脏检查”,因为它在某种程度上扫描了变化的范围。 我不能说是否比可观察的模式更好或更差。 这取决于你的需求。
一些链接:
- Angular文档
- 关于Angular范围的博客文章
angular度脏检查机制工作stream程。
脏检查是一个简单的过程,归结为一个非常基本的概念:它检查值是否已经改变,但尚未在应用程序中同步。
我们的Angular应用程序跟踪当前手表的价值。 Angular走向$ watch列表,如果更新后的值没有从旧值更改,则继续向下。 如果值已更改,则应用程序会logging新值并继续向下观看$ watch列表。
看看这里的整个文章
什么是脏检查?
检查每个手表以检测更改的过程称为脏检查。 可能有两种情况
第一 –
- 从列表中获取一个手表
- 检查项目是否已更改
- 如果项目没有变化的话
- 没有采取行动,移到监视列表中的下一个项目
第二-
- 从列表中获取一个手表
- 检查项目是否已更改
- 如果项目中有更改
- DOM需要更新,返回摘要循环
在第二种情况下,循环继续,直到在整个循环中找不到变化。 一旦完成,DOM会根据需要进行更新。
只是修改以前的答案…
Angular有一个“消化周期”的概念。 你可以把它看成一个循环。 在哪个angular度检查是否有所有variables被所有$ scopes 监视(内部$ watch()和$ apply()函数与$ scope中定义的每个variables绑定 )。
所以,如果你在你的控制器中定义了$ scope.myVar(这意味着这个variables'myVar'被标记为被监视),那么你明确告诉Angular在循环的每次迭代中监视'myVar'的变化。 所以当'myVar'的值发生变化时,每一次$ watch()都会注意到并执行$ apply()来应用DOM中的变化。
这个“ 摘要 ”也被称为“ 脏检查 ”,因为它在某种程度上扫描了变化的范围。 由于所有监视的variables都处于单个循环(摘要循环)中,任何variables的任何值更改都会强制重新分配DOM中其他监视variables的值。
优点:这是Angular实现双向数据绑定的方式。
缺点:如果单个页面中有更多的被监视的variables(> 2000-3000),你可能会在页面加载的时候看到滞后(但是我说如果在一个页面中有很多“被监视的variables”,这是一个不好的页面devise:p)。
还有其他的缺点,以及解决方法也是:D
我在这篇博客文章中阅读了一篇关于脏检的好文章。 还有这个答案
TLDR; 版
当$ digest循环开始时,观察者将检查范围模型中的任何变化,如果有变化(变化也可能来自超出angular度的域),则执行相应的监听器函数。 这将再次运行$ digest循环,并检查范围模型是否已更改(侦听器函数也可以修改范围模型)。
总的来说,即使听众没有改变模型或直到最大循环数为10,$ digest循环也会运行两次。
脏检查将检查$ scopevariables中的任何更改并将其更新到DOM。 这个由angularjs完成,你也可以通过你自己的方式来执行脏检查。