AngularJS的数据双向绑定是怎么实现的?

如果只是简单input的内容改变只要监听事件就行,这一边比较好理解, 但如果我通过$scope.attr="xxx"去改变属性值,其内部是怎么知道我修改了这个属性并更新视图的呢?
关注者
528
被浏览
72279

15 个回答

看到某个答案被顶了几票, 担心会误导新手。

angular并不存在定时脏检测。
angular对常用的dom事件,xhr事件等做了封装, 在里面触发进入angular的digest流程。
在digest流程里面, 会从rootscope开始遍历, 检查所有的watcher。

angular性能优化心得

谈起angular的脏检查机制(dirty-checking), 常见的误解就是认为: ng是定时轮询去检查model是否变更。
其实,ng只有在指定事件触发后,才进入$digest cycle:

  • DOM事件,譬如用户输入文本,点击按钮等。(ng-click)
  • XHR响应事件 ($http)
  • 浏览器Location变更事件 ($location)
  • Timer事件($timeout, $interval)
  • 执行$digest()或$apply()
那个定时的答案不正确,会误导人,我之前写过一篇,里面有个很简单的例子,更接近真实的做法:

Angular沉思录(一)数据绑定 · Issue #10 · xufei/blog · GitHub

如果要深究其变更原理,可以看我翻译的这篇:

Make-Your-Own-AngularJS/01.md at master · xufei/Make-Your-Own-AngularJS · GitHub
为什么?