双向数据绑定

本文介绍了三种实现双向数据绑定的方法:脏检查(如AngularJS 1.x.x)、观察机制(利用Object.observe)及封装属性访问器(如Vue.js)。每种方法都有详细说明,并探讨了它们的优缺点。

双向数据绑定原理(三种实现方式)

  1. <!DOCTYPE html>  
  2. <html>  
  3.     <head>  
  4.         <meta charset="UTF-8">  
  5.         <title>双向数据绑定原理(三种实现方式)</title>  
  6.     </head>  
  7.     <body>  
  8.         <input type="text" id="a" />  
  9.         <span id="b"></span>  
  10.         <!--  
  11.               
  12.             //脏检查  
  13.             我们说Angularjs(这里特指AngularJS 1.x.x版本,不代表AngularJS 2.x.x版本)双向数据绑定的技术实现是脏检查,大致的原理就是,  
  14.             Angularjs内部会维护一个序列,将所有需要监控的属性放在这个序列中,当发生某些特定事件时(注意,  
  15.             这里并不是定时的而是由某些特殊事件触发的),Angularjs会调用 $digest 方法,这个方法内部做的逻辑就是遍历所有的watcher,  
  16.             对被监控的属性做对比,对比其在方法调用前后属性值有没有发生变化,如果发生变化,则调用对应的handler。  
  17.             网上有许多剖析Angularjs双向数据绑定实现原理的文章,比如 这篇 ,再比如 这篇 ,等等。  
  18.             这种方式的缺点很明显,遍历轮训watcher是非常消耗性能的,特别是当单页的监控数量达到一个数量级的时候。  
  19.               
  20.             //观察机制  
  21.             博主之前有一篇转载翻译的文章, Object.observe()带来的数据绑定变革 ,说的就是使用ECMAScript7中的 Object.observe 方法对对象  
  22.             (或者其属性)进行监控观察,一旦其发生变化时,将会执行相应的handler。  
  23.             这是目前监控属性数据变更最完美的一种方法,语言(浏览器)原生支持,没有什么比这个更好了。唯一的遗憾就是目前支持广度还不行,有待全面推广。  
  24.               
  25.             //封装属性访问器  
  26.             国产mvvm框架vue.js实现数据双向绑定的原理就是属性访问器。  
  27.             它使用了ECMAScript5.1(ECMA-262)中定义的标准属性 Object.defineProperty 方法。针对国内行情,  
  28.             部分还不支持 Object.defineProperty 低级浏览器采用VBScript作了完美兼容,不像其他的mvvm框架已经逐渐放弃对低端浏览器的支持。  
  29.               
  30.         -->  
  31.         <script>  
  32.           
  33.             //封装属性访问器  
  34.             //Object.defineProperty(obj, prop, descriptor)  
  35.             //obj ,待修改的对象  
  36.             //prop ,带修改的属性名称  
  37.             //descriptor ,待修改属性的相关描述  
  38.             var obj = {};  
  39.             Object.defineProperty(obj,'a',{  
  40.                 set:function(newVal){  
  41.                     document.getElementById('a').value = newVal;  
  42.                     document.getElementById('b').innerHTML = newVal;  
  43.                 }  
  44.             });  
  45.               
  46.             document.addEventListener('keyup',function(e){  
  47.                 obj.a = e.target.value;  
  48.             });  
  49.               
  50.               
  51.         </script>  
  52.           
  53.     </body>  
  54. </html>  

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值