实现数据绑定的做法大致分为:1,开发者 - 订阅者模式 2.脏值检查 3.数据劫持
Angular双向数据绑定的原理是数据脏检测: 1.添加监听器$ watcher 2.数据改变时调用所有watcher中
界面到数据的更改,是由UI事件,ajax请求,或者超时等回调操作,而数据到界面的呈现则是由脏检查来做。
Angular在范围模型上设置了一个监听队列,用来监听数据变化并更新视图。每次绑定一个东西到查看上时AngularJS就会往$ watch队列里插入一条$ watch,用来检测它监视的模型里是否有变化的东西。在指定事件【注】触发后,进入$
digest循环,$ digest循环就会触发,遍历所有的$ watch,最后更新dom。
注:比如输入,点击,XHR响应事件($ http),执行$ digest()或$ apply(),定时器事件($ timeout。$ interval),浏览器位置变更事件($ location)。
当视图中有任何数据变化时,会更新到模型,当模型发生变化,会检测所有视图是否绑定了相关数据,再更改视图。
Vue采用数据劫持结合发布者 - 订阅者模式,是点对点的绑定数据: Vue的数据里的每个属性都有set和get方法。通过Object.defineProperty()来劫持各个属性的setter,getter,在数据变动时发布消息给订阅者,触发相应的监听回调。
new Vue()初始化过程中主要执行两个步骤:编译和链接。
编译过程中,对于给定的目标元素进行解析,识别出所有绑定在元素(通过el属性传入)上的指令。
链接过程中,建立这些指令与对数据(通过数据属性传入初始值)的绑定关系,并以数据的初始值进行渲染。