angular 脏检查机制

来源:互联网 发布:爆伤和黄字算法 编辑:程序博客网 时间:2024/05/21 10:59

很久没有写点东西了,从今天起,在博客园对自己过往的工作,学习和生活做一些梳理,总结和温故。今天窗外的阳光不那么任性,天空白云点点,蝉鸣依旧嘹亮,安静地坐在阳台上,吹着风,敲击着键盘。于我而言,这就是幸福生活。

 

  转入正题,对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遍历中被执行。


原创粉丝点击