数据监听
vm形式的中心就是数据变化驱动视图更新,个中症结的一点就是,我们怎样能晓得数据发生了变化?
宣布-定阅模子
经由过程事宜的宣布/监听的形式来完成数据监听. 即数据变化后,宣布者会触发自定义的某个事宜比方valueChage
,然后定阅者捕捉到这个事宜后,完成后续处置惩罚(值推断/视图更新/其他自定义逻辑
). 这实在就是最简朴的事宜处置惩罚的机制
待补充
GET/SET
监测数据的变化另有一种简朴且较为圆满的完成,而且现在非常炽热的Vm框架Vue也是应用了这类体式格局.那就是Es5中对对象的新增的扩大要领Object.defineProperty()
. 它带来了无数可能性.经由过程对对象的属性设置改要领,我们也能随意马虎的完成数据变化后的逻辑处置惩罚.
先来简朴看一看Object.defineProperty()的简朴运用
Object.defineProperty(obj, prop, descriptor)
var obj = {};
Object.defineProperty(obj, "name", {
enumerable: true,
configurable: true,
get: function () {
console.log('get#');
return name;
},
set: function (newValue) {
console.log('set#');
name = newValue + "~~~";
}
});
obj.name = 'Xie' // set#
console.log(obj.name); //get# Xie~~~
obj.name = 'Min' // set#
console.log(obj.name); //get# Min~~~
参数引见:
value:属性的值
writable:假如为false,属性的值就不能被重写
get: 一旦目的属性被接见就会调回此要领,并将此要领的运算效果返回用户
set:一旦目的属性被赋值,就会挪用此要领
configurable:假如为false,则任何尝试删除目的属性或修正属性以下特征(writable, configurable, enumerable)的行动将被无效化
enumerable:是不是能在for…in循环中遍历出来或在Object.keys中枚举出来
P.s writeble/value
不能和get/set
共存,由于object不允许有两种接见机制存在.
完成数据驱动
恰是由于get/set这类特征,我们就可以经由过程设置set要领来完成数据变化->视图更新
的逻辑
<input id='input'>
<p id="output"></p>
var obj = {};
$('#input').on('input',function(){
obj.data = $(this).val();
});
Object.defineProperty(obj, "data", {
enumerable: true,
configurable: true,
get: function () {
return data;
},
set: function (newData) {
data = newData;
$('#output').text(data);
}
});
数据变化驱动视图更新
是MVVM形式中VM的中心逻辑,这类形式下的任何时候,我们都不应当直接以支配DOM节点的体式格局来转变视图, 而是必需经由过程转变数据状况的体式格局,驱动数据状况变化来转变视图(详细体式格局上面已提到了,捕捉valueChage事宜/SET
等) Angular/Vue/Avalone/等等之类的MVVM框架,就是封装并优化了这一个步骤.