angularjs脏检查机制
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了angularjs脏检查机制相关的知识,希望对你有一定的参考价值。
很久没有写点东西了,从今天起,在博客园对自己过往的工作,学习和生活做一些梳理,总结和温故。今天窗外的阳光不那么任性,天空白云点点,蝉鸣依旧嘹亮,安静地坐在阳台上,吹着风,敲击着键盘。于我而言,这就是幸福生活。
转入正题,对angularjs脏检查机制做了个回顾和总结如下:
参考文章:
http://teropa.info/build-your-own-angular/
http://www.cnblogs.com/likeFlyingFish/p/6183630.html
http://www.ituring.com.cn/article/39865
1、Angular并不是周期性触发脏检查,更不是长连接轮询检查。
2、一般一个事件循环中执行到任务队列时,如UI事件,ajax请求或者 timeout 延迟事件等触发脏检查。
3、Angular 每一个绑定到UI的数据,就会有一个 $watch 对象。
4、所有的watch存储在$$watchList中,一次脏检查就是调用一次 $apply() 或者 $digest(),遍历检查所有watch,将数据中最新的值呈现在界面上。
5、$digest现在至少运行每个监听器一次了。如果第一次运行完,有监控值发生变更了,标记为dirty,所有监听器再运行第二次。这会一直运行,直到所有监控的值都不再变化,整个局面稳定下来了。
6、关于$apply,大的想法是,我们可以执行一些与Angular无关的代码,这些代码也还是可以改变作用域上的东西,$apply可以保证作用域上的监听器可以检测这些变更。当人们谈论使用$apply集成代码到“Angular生命周期”的时候,他们指的就是这个事情,也没什么比这更重要的了。
7、但在Angular中还有一种延迟代码的方式,那就是Scope上的$evalAsync函数。$evalAsync接受一个函数,把它列入计划,在当前正持续的digest中或者下一次digest之前执行。举例来说,你可以在一个监听器的监听函数中延迟执行一些代码,即使它已经被延迟了,仍然会在现有的digest遍历中被执行。
以上是关于angularjs脏检查机制的主要内容,如果未能解决你的问题,请参考以下文章
再谈angularJS数据绑定机制及背后原理—angularJS常见问题总结
再谈angularJS数据绑定机制及背后原理—angularJS常见问题总结