闲来无事,实现一个只具最基本数据双向绑定的js

近期项目内用knockoutjs。

想模拟实现数据双向绑定的基本功能。

只具有最基本的功能,且很多细节未曾考虑,也未优化精简。

能想到的缺少的模块

1事件监听,自定义访问器事件

2模版

3父子级

编码时,有两个循环陷阱。

只依赖浏览器,打开即可运行。

工作以后端和数据为主,前端较生疏,将就看吧

 1 <!DOCTYPE html>
 2 <html>
 3 <head lang="en">
 4     <meta charset="UTF-8">
 5     <title></title>
 6 </head>
 7 <body>
 8 <br>
 9 <lable>name</lable><input type="text" data-bind="name" value="old"/><br>
10 <lable>age</lable><input  type="text" data-bind="value" value="18"/><br>
11 <!--<lable>sex</lable><input  type="text"  value="男"/><br>-->
12 <input type="button" onclick="mvvm.bind(window.ViewModel)" value="绑定数握">
13 <input type="button" onclick="mvvm.Saybind(window.ViewModel)" value="查看数据">
14 <input type="button" onclick="window.ViewModel.changename()" value="改名">
15
16 </body>
17 <script>
18     (function(win){
19         window.mvvm={
20             bind:function(obj){
21                 var inputs = document.getElementsByTagName("input");
22                 if(!obj.hasini){
23                     alert("初始化访问器")
24                     //为model添加访问器,目的,是model时更新UI
25                     for (var Property in obj) {
26                         (function(){
27                             var proname=Property;
28                             var priname="_"+proname;
29                             if(typeof obj[Property]!="function"){
30                                 obj[priname]=obj[proname];
31                                 obj[proname]=null;
32                                 var setget={
33                                     get: function () {
34                                         return obj[priname]
35                                     },
36                                     set:function (value) {
37                                         obj[priname] = value;
38                                         for (var i = 0; i < inputs.length; i++) {
39                                             var att = inputs[i].getAttribute("data-bind");
40                                             if (att == proname) {
41                                                 inputs[i].value = obj[priname];
42                                                 break;
43                                             }
44                                         }
45                                     }
46                                 }
47                                 Object.defineProperty(obj, proname, setget);
48                             }
49                         })(obj,Property)
50                     }
51                 }
52                 obj.hasini=true;
53                 alert("初始化完成")
54                 //为UI绑定model的值,并为UI添加事件,修改UI时更新Model值。
55                 for (var i = 0; i < inputs.length; i++) {
56                     var inputdom = inputs[i];
57                     var att = inputdom.getAttribute("data-bind");
58                     if (att != null) {
59                         for (var Property in obj) {
60                             if (Property == att) {
61 //                      绑定属性
62                                 inputdom.value = obj[Property];
63 //                      绑定事件
64                                 inputdom.onchange = function () {
65                                     obj[this.getAttribute("data-bind")] = this.value;
66                                 }
67                             }
68                         }
69                     }
70                 }
71             },
72             Saybind:function(obj){
73                 alert(obj.toString());
74             }
75         }
76
77     })(window);
78     var ViewModel={
79         name:"cui",
80         value:"24",
81         toString:function(){
82             var ps="";
83             for(var Property in this){
84                 if(typeof this[Property]!="function")
85                     ps+=Property+":"+this[Property]+";"
86             }
87             return ps;
88         },
89         changename:function(){
90             this.name="daming";
91         }
92     } ;
93
94 </script>
95 </html>
时间: 2024-12-20 19:05:45

闲来无事,实现一个只具最基本数据双向绑定的js的相关文章

数据的双向绑定 Angular JS

接触AngularJS许了,时常问自己一些问题,如果是我实现它,会在哪些方面选择跟它相同的道路,哪些方面不同.为此,记录了一些思考,给自己回顾,也供他人参考. 初步大致有以下几个方面: 数据双向绑定 视图模型的继承关系 模块和依赖注入的设计 待定 数据的双向绑定 Angular实现了双向绑定机制.所谓的双向绑定,无非是从界面的操作能实时反映到数据,数据的变更能实时展现到界面. 一个最简单的示例就是这样: <div ng-controller="CounterCtrl"> &

vue的双向绑定原理及实现

前言 使用vue也好有一段时间了,虽然对其双向绑定原理也有了解个大概,但也没好好探究下其原理实现,所以这次特意花了几晚时间查阅资料和阅读相关源码,自己也实现一个简单版vue的双向绑定版本,先上个成果图来吸引各位: 代码:                                                                    效果图:   是不是看起来跟vue的使用方式差不多?接下来就来从原理到实现,从简到难一步一步来实现这个SelfVue.由于本文只是为了学习和分享

VUE的数据双向绑定

1.概述 让我们先来看一下官网的这张数据绑定的说明图: 原理图告诉我们,a对象下面的b属性定义了getter.setter对属性进行劫持,当属性值改变是就会notify通知watch对象,而watch对象则会notify到view上对应的位置进行更新(这个地方还没讲清下面再讲),然后我们就看到了视图的更新了,反过来当在视图(如input)输入数据时,也会触发订阅者watch,更新最新的数据到data里面(图中的a.b),这样model数据就能实时响应view上的数据变化了,这样一个过程就是数据的

简单实现一个双向绑定

看了一些关于双向绑定的文章,现在来整理一下思路. 首先实现双向绑定有三个步骤: 需要一个方法来识别哪一个的view被绑定了相应的数据 需要监视数据和view的变化 需要将所有变化传播到绑定的对象和对应的view 为了解决第一个问题,要在对应的dom上添加相应的data-bind-<prop_name>属性,比如: num: <input type="number" data-bind-num> <div data-bind-num></div&

mysql5基础 创建一个只允许本地登陆的用户

镇场文:        学儒家经世致用,行佛家普度众生,修道家全生保真,悟易理象数通变.以科技光耀善法,成就一良心博客. ______________________________________________________________________________________________________ Operating System:UbuntuKylin 16.04 LTS 64bit mysql: Ver 14.14 Distrib 5.7.17, for Linu

IT公司100题-17-第一个只出现一次的字符

问题描述: 在一个字符串中找到第一个只出现一次的字符.例如输入asdertrtdsaf,输出e. 分析: 最简单的方法是直接遍历,时间复杂度为O(n^2). 进一步思考: 字符串中的字符,只有256种可能性,使用字符的为下标,扫描一遍,存储各个字符在字符串中的出现.第二次扫描字符串,查看每个字符在字符串中的出现次数,如果为1,输出即可. 代码实现: // 17.cc #include #include #include using namespace std; char find_char(co

制作一个只运行bash的系统及破坏mbr表并修复

制作一个只运行bash的系统 1.新增一块硬盘,分三个区. 分区1:boot目录100M 分区2:2G,swap分区 分区3:5G,根目录. 其中分区1.3格式化为ext4文件系统,分区2格式化为swap. 2./mnt下新建两个目录boot和sysroot. 分区1挂载至boot目录,分区3挂载至sysroot目录 grub安装至分区1,复制内核和initramfs至boot目录 [[email protected] ~]# mount /dev/sdb1 /mnt/boot [[email 

vue组件双向绑定.sync修饰符的一个坑

我们知道组件是单项的,但是有时候需要双向,这时候我们可以使用.sync修饰符,但今天遇到一个坑,一直不成功,花了半小时试出来的.... 在编程的时候我们很习惯冒号后面跟着空格.而.sync双向绑定需要子组件显性触发 this.$emit('update:foo', newValue) 这里的updata:foo可以说是一个名字,不能加空格,不能加空格,不能加空格!!!这就是坑,由于编程习惯,也许会有人加空格,我也是,所以写出来当作一个笔记. 根据文档 <comp :foo.sync="ba

给定一个只包含正整数的非空数组,返回该数组中重复次数最多的前N个数字 ,返回的结果按重复次数从多到少降序排列(N不存在取值非法的情况)

1 """ 2 #给定一个只包含正整数的非空数组,返回该数组中重复次数最多的前N个数字 3 #返回的结果按重复次数从多到少降序排列(N不存在取值非法的情况) 4 解题思路: 5 1.设定一个空字典,去存储列表中的值和值出现的次数 6 2.使用L.count()方法可以统计出L中值出现的次数 7 3.使用sorted方法可以进行排序,sorted(iterable,key,reverse) 8 注意key是函数 9 4.列表中的元祖取值 d[i][j] i是哪一个元祖,j是元祖