js 超浓缩 双向绑定

时间: 2019-10-11阅读: 286标签: 双向绑定

绑定确实是个有趣的话题。

现在我的绑定器有了不少的功能

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>


站长推荐

1.阿里云: 本站目前使用的是阿里云主机,安全/可靠/稳定。点击领取2000元代金券、了解最新阿里云产品的各种优惠活动点击进入

2.腾讯云: 提供云服务器、云数据库、云存储、视频与CDN、域名等服务。腾讯云各类产品的最新活动,优惠券领取点击进入

3.广告联盟: 整理了目前主流的广告联盟平台,如果你有流量,可以作为参考选择适合你的平台点击进入

链接: http://www.fly63.com/article/detial/6387

vue双向数据绑定失效_解决vue添加新属性实现双向绑定

vue框架目前在前端开发使用比较广了,但是又很多同学发现vue创建对象之后添加新的属性实现不了双向绑定,下面就简单介绍如何解决vue双向绑定出现失效的问题

原生js实现数据双向绑定的三种方式总汇

前端的视图层和数据层有时需要实现双向绑定(two-way-binding),例如mvvm框架,数据驱动视图,视图状态机等,研究了几个目前主流的数据双向绑定框架,总结了下。目前实现数据双向绑定主要有以下三种。

angular数据双向绑定的原理是什么?

页面中每绑定一个数据或者事件时,就会向$watch队列中加入一条$watch,当浏览器接受到可以被angular context(当事件触发,调用$apply进入angular context)处理的事件时,就会触发digest循环,它会遍历每一个$watch检查其属性和值是否发生改变

Vue - 自定义组件双向绑定

无论在任何的语言或框架中,我们都提倡代码的复用性。对于Vue来说也是如此,相同的代码逻辑会被封装成组件,除了复用之外,更重要的是统一管理提高开发效率。我真就接手过一个项目,多个页面都会用到的列表

vue实现双向绑定其他元素以及自定义表单控件

v-model 只能用于表单控件,如果用于其他元素。如何让组件的 v-model 生效呢?需要按照 Vue 的约定:接受一个 value 属性,在有新的 value 时触发 input 事件

vue双向绑定原理分析

当我们学习angular或者vue的时候,其双向绑定为我们开发带来了诸多便捷,今天我们就来分析一下vue双向绑定的原理。vue.js 则是采用数据劫持结合发布者-订阅者模式的方式,通过Object.defineProperty()来劫持各个属性的setter,getter

简单实现一个vue的双向绑定

首先我们来看一些,vue的基本使用方法;然后我们根据使用方法,来设计一个类和一些基础的声明周期;获取根元素;生命周期 beforeCreate;获取初始数据;获取渲染函数

Vue双向绑定的实现原理

vue.js 采用数据劫持的方式,结合发布者-订阅者模式,通过Object.defineProperty()来劫持各个属性的setter,getter以监听属性的变动,在数据变动时发布消息给订阅者,触发相应的监听回调.

如何理解vue中的v-model?

说到v-model,就想到了双向数据绑定,而且往往最常见的是在表单元素<input>,<textarea>,<select>中的使用。那么为什么v-model双向数据绑定,自动更新元素呢?

VUE:computed 和 v-model 配合使用,双向绑定失效

今天在实现一个表单赋值并修改的功能时,由于其中数值直观显示不美观,所以使用了 computed 计算属性,同时使用 v-model 的双向绑定,来处理显示。但却发现 v-model 的双向绑定失效了,控制台警告信息如下:

内容以共享、参考、研究为目的,不存在任何商业目的。其版权属原作者所有,如有侵权或违规,请与小编联系!情况属实本人将予以删除!

文章投稿关于web前端网站点搜索站长推荐网站地图站长QQ:522607023

小程序专栏: 土味情话心理测试脑筋急转弯幽默笑话段子句子语录成语大全运营推广