绑定确实是个有趣的话题。
现在我的绑定器有了不少的功能
1. 附着在Object对象上,一切以对象为中心
2. 与页面元素进行双向绑定
3. 与任意对象绑定,主要是应用在绑定到页面元素的一些属性上,比如style,当然也可以绑定到任意用户自定义的对象上
4. 可以绑定到方法,让对象具有AddEventListener类似的功能,这应该是终极的扩展功能了
5. 支持selector,function,object 的参数写法
6. 默认绑定到value或者innerhtml属性上
Object.prototype.bind = function (key, obj, prop, event) { var that = this if (this[key] == undefined) this[key] = ‘‘; var bc = undefined; if (!this.__bc__) { this.__bc__ = {}; Object.defineProperty(this, "__bc__", { enumerable: false }); } if (!this.__bc__[key]) { this.__bc__[key] = []; this.__bc__[key].value = this[key] bc = this.__bc__[key]; Object.defineProperty(this, key, { get: function () { return bc.value }, set: function (value) { if (bc.value == value) return; bc.forEach(function (l) { l(value); }) bc.value = value } }) } bc = this.__bc__[key]; if (prop == undefined) prop = "value"; if (event == undefined) event = ‘change‘; if (typeof obj == ‘string‘) { var els = document.querySelectorAll(obj); function b(el, p) { if (el[p] == undefined) p = "innerHTML" bc.push(function (value) { el[p] = value; }); if (el.addEventListener) { el.addEventListener(event, function (e) { that[key] = el[p]; }) } el[p] = bc.value; } for (var i = 0; i < els.length; i++) { var el = els[i]; b(el, prop) } } else if (typeof obj == ‘function‘) { bc.push(obj); obj(bc.value); } else if (typeof obj == ‘object‘) { var p = prop if (obj[p] == undefined) p = "innerHTML" bc.push(function (value) { obj[p] = value; }) obj[p] = bc.value; if (obj.addEventListener) { obj.addEventListener(event, function (e) { that[key] = obj[p]; }) } } else { console.log("obj = " + obj + " 不是 [selector,function,element] 中的任何一种,绑定失败!") } }
再来个简单的例子
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <meta name="viewport" content="width=device-width, initial-scale=1.0"> <meta http-equiv="X-UA-Compatible" content="ie=edge"> <title>测试项目</title> <script src="bind.js"></script> </head> <body> <h1 class="v1"></h1> <input class="v1" type="text" id="i1"> <input type="text" id="i2"> <script> var a = { value: ‘s‘, s: ‘red‘ } a.bind(‘value‘, ".v1", ‘value‘, ‘input‘) a.bind(‘s‘, i1.style, ‘background‘) a.bind(‘s‘, i2) </script> </body> </html>
前端的视图层和数据层有时需要实现双向绑定(two-way-binding),例如mvvm框架,数据驱动视图,视图状态机等,研究了几个目前主流的数据双向绑定框架,总结了下。目前实现数据双向绑定主要有以下三种。
vue.js 采用数据劫持的方式,结合发布者-订阅者模式,通过Object.defineProperty()来劫持各个属性的setter,getter以监听属性的变动,在数据变动时发布消息给订阅者,触发相应的监听回调.
vue框架目前在前端开发使用比较广了,但是又很多同学发现vue创建对象之后添加新的属性实现不了双向绑定,下面就简单介绍如何解决vue双向绑定出现失效的问题
用到 contenteditable=true的 div ,而在这个 div 上是使用 v-model 是没有效果的,这里的双向数据绑定该如何实现?解决思路:一自定义指令,二使用组件。
v-model 双向绑定实际上就是通过子组件中的 $emit 方法派发 input 事件,父组件监听 input 事件中传递的 value 值,并存储在父组件 data 中;然后父组件再通过 prop 的形式传递给子组件 value 值,再子组件中绑定 input 的 value 属性即可。
当我们学习angular或者vue的时候,其双向绑定为我们开发带来了诸多便捷,今天我们就来分析一下vue双向绑定的原理。vue.js 则是采用数据劫持结合发布者-订阅者模式的方式,通过Object.defineProperty()来劫持各个属性的setter,getter
首先我们来看一些,vue的基本使用方法;然后我们根据使用方法,来设计一个类和一些基础的声明周期;获取根元素;生命周期 beforeCreate;获取初始数据;获取渲染函数
用过Vue的同学都知道,Vue里<input> 、 <textarea> 及 <select>等表单元素可以通过v-model指令实现双向数据绑定,也就是说,当用户通过交互改变表单的值时,表单绑定的数据也会同步响应,这一点也是Vue对开发人员非常友好的点之一。
无论在任何的语言或框架中,我们都提倡代码的复用性。对于Vue来说也是如此,相同的代码逻辑会被封装成组件,除了复用之外,更重要的是统一管理提高开发效率。我真就接手过一个项目,多个页面都会用到的列表
今天在实现一个表单赋值并修改的功能时,由于其中数值直观显示不美观,所以使用了 computed 计算属性,同时使用 v-model 的双向绑定,来处理显示。但却发现 v-model 的双向绑定失效了,控制台警告信息如下:
内容以共享、参考、研究为目的,不存在任何商业目的。其版权属原作者所有,如有侵权或违规,请与小编联系!情况属实本人将予以删除!