Angular 更新绑定的原理?

  1)先来说说,angular是怎么知道变量发生了改变:

         脏检查,将原对象复制一份快照,在某个时间,比较现在对象与快照的值,如果不一样就表明发生变化;


  2) 很明显,这个策略要保留两份变量,而且要遍历对象,比较每个属性,这样不会有性能问题吗?

       .) 首先是脏检查的对象:

          angualar不会脏检查所有的对象,当对象被绑定到html中,这个对象添加为检查对象;

          angular不会脏检查所有的属性,同样当属性被绑定后,这个属性会被列为检查的属性;

        

       .)其次就是什么时候去脏检查

             angular在我们所写的绝大部分代码中都会触发比较事件。

               比如:controller 初始化的时候,

                        ng-click事件和所有以ng-开头的事件执行后,

                         $http 回调完成后,都会触发脏检查。

             当然,触发脏检查的点是在函数执行完之后,但不表明异步调用也执行完成,

             所以,如果我们的功能是异步的,那你会发现我们的改变并没有更新到dom上.

             这就是 $apply的应用场景,使用$scope.$apply()手动触发脏检查

             .)apply()接受一个function的参数,function中被绑定的对象会被脏检查,function不能是异步的哦;

             .)$apply()不带参数时,会将当前作用域的所有监听对象都脏检查一遍,所以不带参数是有害的, 必然会做很多无用的脏检查,浪费性能

         .) 再次就是如何脏检查

             脏检查是由 $digest() 完成,$apply()被调用之后,最终会触发 $digest();



http://my.oschina.net/gejiawen0913/blog/187349