实现数据双向绑定的方法: 1.发布者-订阅者模式(backbone.js) 思路:使用自定义的data属性,在HTML代码中指明绑定。所有绑定起来的javascript对象以及DOM元素都将订阅在一个发布者对象。 任何时候js对象或者一个HTML输入字段被侦测到发生变化,将代理事件变成发布者-订阅者模式,这会反过来变化广播,并传播到所有绑定的js对象以及DOM元素上。 12588213 347213136 2.数据劫持结合发布者-订阅者模式(vue.js) vue.js采用数据劫持结合发布者-订阅者的方式,通过Object.defineProperty()来劫持各个属性的setter,getter,在数据变动时,发布消息给订阅者,触发相应的监听回调。 具体来说,vue.js通过Directives指令去对DOM做封装,当数据发生变化,会通知指令去修改对应的DOM,数据驱动DOM的变化。vue.js还会对操作做一些监听(DOM Listener)
var obj = {}; Object.defineProperty(obj,'hello',{ //obj --- 变量名,hello --- 变量的属性名(任意取名) get: function(){ console.log('get val:'+value); //value--属性“hello”的值 return value; }, set:function(newVal){ value = newVal; console.log('set val:' + value); } });
object.hello = '111'; obj.hello;
可见Object.defineProperty()监控对数据的操作,可以自动触发数据同步 A.首先,获取文本中的真实的DOM节点 B.然而,分析节点的类型 C.最后,根据节点的类型做相应的处理 到这我们获取了文本中真实的DOM节点,然后分析节点的类型,并能处理节点中相应的变量,如上面的{{text}},最后渲染到页面中。 最后,需要和双向绑定联系起来,实现{{text}}相应是的数据绑定。
简单的observe定义如下 function defineReactive(obj,key,val){ Object.defineProperty(obj,key,{ get: function(){ return val; }, set:function(newVal){ if(newVal === val) return; val = newVal; console.log(val); } }) } function observe(obj,vm){ Object.keys(obj).forEach(function(key){ defineReactive(vm, key, obj[key]); }) } 需要监控data的属性值,对象的某个属性被赋值了,就会触发setter,这样就能监听到数据的变化。
while(child = node.fristChild){
self.compileElement(child,vm);
frag.append(child);
}
return frag;
}, compileElement: function(node,vm){ var reg = /{{(.*)}}/; //节点类型为元素 if(node.nodeType === 1){
}
}
}