您的位置:首页 > Web前端 > JavaScript

js实现双向数据绑定

2017-10-10 17:55 411 查看

需求

现在的框架都讲究什么单向绑定,双向绑定的都是什么东西?

- 单向数据绑定:指的是我们先把模板写好,然后把模板和数据(数据可能来自后台)整合到一起形成HTML代码,然后把这段HTML代码插入到文档流里面。

- 双向数据绑定:数据模型(Module)和视图(View)之间的双向绑定。就是我不管修改数据模型的相关数据,还是视图上的数据,相对应的数据也会跟着更新。

实现原理

主要的就是事件的绑定。

- 在视图层(View)上,可以绑定keyup事件,来更新数据模型

- 在数据模型上面利用Object.defineProperty()方法定义对象的set方法,在触发对象属性设置时,将view层的数据也修改掉。

案例代码

<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Title</title>
</head>
<body>
<input type="text" id="myinput" >
<script>
var input = document.getElementById("myinput");
var obj = {};
Object.defineProperty(obj, "input", {
get: function () {
return input.value;
},
set: function (val) {
input.value = val;
changeCallback(input.value);
}
});

input.onkeyup = function () {
obj.input = input.value;
};

function changeCallback(val) {
console.log("这里是不管view层,还是module层修改后的回调,最后设置的值是"+val);
}

</script>
</body>
</html>


思路

首先,我们先使用Object.defineProperty()方法设置obj的set方法,只要修改obj的input属性,就会触发这个这个set方法,然后触发回调,这就实现了module层的数据绑定。

然后,再input上绑定keyup事件,实现了view层的绑定。

只要两者有一个修改,不管input的value值,还是获取obj的input属性,都是获取最新修改的值。

这应该是最简单的思路了。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: