近期项目内用knockoutjs。

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

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

能想到的缺少的模块

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

2模版

3父子级

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

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

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

 <!DOCTYPE html>
<html>
<head lang="en">
<meta charset="UTF-8">
<title></title>
</head>
<body>
<br>
<lable>name</lable><input type="text" data-bind="name" value="old"/><br>
<lable>age</lable><input type="text" data-bind="value" value="18"/><br>
<!--<lable>sex</lable><input type="text" value="男"/><br>-->
<input type="button" onclick="mvvm.bind(window.ViewModel)" value="绑定数握">
<input type="button" onclick="mvvm.Saybind(window.ViewModel)" value="查看数据">
<input type="button" onclick="window.ViewModel.changename()" value="改名"> </body>
<script>
(function(win){
window.mvvm={
bind:function(obj){
var inputs = document.getElementsByTagName("input");
if(!obj.hasini){
alert("初始化访问器")
//为model添加访问器,目的,是model时更新UI
for (var Property in obj) {
(function(){
var proname=Property;
var priname="_"+proname;
if(typeof obj[Property]!="function"){
obj[priname]=obj[proname];
obj[proname]=null;
var setget={
get: function () {
return obj[priname]
},
set:function (value) {
obj[priname] = value;
for (var i = 0; i < inputs.length; i++) {
var att = inputs[i].getAttribute("data-bind");
if (att == proname) {
inputs[i].value = obj[priname];
break;
}
}
}
}
Object.defineProperty(obj, proname, setget);
}
})(obj,Property)
}
}
obj.hasini=true;
alert("初始化完成")
//为UI绑定model的值,并为UI添加事件,修改UI时更新Model值。
for (var i = 0; i < inputs.length; i++) {
var inputdom = inputs[i];
var att = inputdom.getAttribute("data-bind");
if (att != null) {
for (var Property in obj) {
if (Property == att) {
// 绑定属性
inputdom.value = obj[Property];
// 绑定事件
inputdom.onchange = function () {
obj[this.getAttribute("data-bind")] = this.value;
}
}
}
}
}
},
Saybind:function(obj){
alert(obj.toString());
}
} })(window);
var ViewModel={
name:"cui",
value:"24",
toString:function(){
var ps="";
for(var Property in this){
if(typeof this[Property]!="function")
ps+=Property+":"+this[Property]+";"
}
return ps;
},
changename:function(){
this.name="daming";
}
} ; </script>
</html>

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

  1. 关于vue.js中v-model与表单控件的双向绑定。

    单选框:<input type="checkbox" id="checkbox" v-model="checked"><l ...

  2. 双向绑定 TwoWay MVVM

    1前台代码 <Grid> <StackPanel > <Grid x:Name="gridOne"> <Grid.Resources> ...

  3. MVVM 框架解析之双向绑定

    更好的阅读体验,点击 原文地址 MVVM 框架 近年来前端一个明显的开发趋势就是架构从传统的 MVC 模式向 MVVM 模式迁移.在传统的 MVC 下,当前前端和后端发生数据交互后会刷新整个页面,从而 ...

  4. 【学习笔记】剖析MVVM框架,简单实现Vue数据双向绑定

    前言: 学习前端也有半年多了,个人的学习欲望还比较强烈,很喜欢那种新知识在自己的演练下一点点实现的过程.最近一直在学vue框架,像网上大佬说的,入门容易深究难.不管是跟着开发文档学还是视频教程,按步骤 ...

  5. WPF MVVM从入门到精通5:PasswordBox的绑定

    原文:WPF MVVM从入门到精通5:PasswordBox的绑定   WPF MVVM从入门到精通1:MVVM模式简介 WPF MVVM从入门到精通2:实现一个登录窗口 WPF MVVM从入门到精通 ...

  6. vue实现双向绑定mvvm

    剖析Vue实现原理 - 如何实现双向绑定mvvm 本文能帮你做什么?1.了解vue的双向数据绑定原理以及核心代码模块2.缓解好奇心的同时了解如何实现双向绑定为了便于说明原理与实现,本文相关代码主要摘自 ...

  7. 前端使用node.js的http-server开启一个本地服务器

    前端使用node.js的http-server开启一个本地服务器 在写前端页面中,经常会在浏览器运行HTML页面,从本地文件夹中直接打开的一般都是file协议,当代码中存在http或https的链接时 ...

  8. anime.js 实战:实现一个带有描边动画效果的复选框

    在网页或者是APP的开发中,动画运用得当可以起到锦上添花的作用.正确使用动画,不但可以有助于用户理解交互的作用,还可以大大提高网页应用的魅力和使用体验.并且在现在的网页开发中,动画已经成为了一个设计的 ...

  9. CloudBase CMS + Next.js:轻松构建一个内容丰富的站点

    项目背景 试想一下,如果你现在要为你自己或者你所在的组织创建一个强内容的站点,同时要求好的 SEO(搜素引擎优化),比如博客,你会怎么做呢? 由 vite 或者 create-react-app 等脚 ...

随机推荐

  1. Elastic ik插件配置热更新功能

    ik github地址:https://github.com/medcl/elasticsearch-analysis-ik 官网说明: 热更新 IK 分词使用方法 目前该插件支持热更新 IK 分词, ...

  2. Codeforce 370C Mittens 巧妙数学题

    这道题目我一开始想错了,觉得只要排好序,再从头到尾把可以相互交换的进行下交换就可以了...事实证明是错的.正确的解法比较巧妙,而且写法非常好,值得学习 首先,要注意的一个规律是,假如最大的颜色数字出现 ...

  3. 吴裕雄--天生自然Linux操作系统:linux yum 命令

    yum( Yellow dog Updater, Modified)是一个在Fedora和RedHat以及SUSE中的Shell前端软件包管理器. 基於RPM包管理,能够从指定的服务器自动下载RPM包 ...

  4. 数据分析基础-jupyter notebook-Anaconda-Numpy

    数据分析介绍 1.数据分析是什么? 2.数据分析能干什么? 3.为什么利用Python进行数据分析? 4.数据分析过程概述 5.常用库简介 1.数据分析是什么? 数据分析是指用适当的统计分析方法对收集 ...

  5. swift bannerview 广告轮播图

    class BannerView: UIView,UIScrollViewDelegate{ //图⽚⽔平放置到scrollView上 private var scrollView:UIScrollV ...

  6. gcc -E xx.c

    C语言代码在交给编译器之前,会先由预处理器进行一些文本替换方面的操作,例如宏展开.文件包含.删除部分代码等. 在正常的情况下,GCC 不会保留预处理阶段的输出文件,也即.i文件.然而,可以利用-E选项 ...

  7. drf框架的解析模块-异常处理模块-响应模块-序列化模块

    解析模块 为什么要配置解析模块 (1).drf给我们通过了多种解析数据包方式的解析类. (2).我们可以通过配置来控制前台提交的那些格式的数据台解析,那些数据不解析. (3).全局配置就是针对一个视图 ...

  8. Android之布局RelativeLayout

    线性布局的weight属性在等比例分配时比较方便,但是对复杂的界面,嵌套多层LinearLayout布局会导致渲染变慢,占用更多系统资源:而使用RelativeLayout的话,可能仅仅需要一层就可以 ...

  9. eclipse导入项目报错解决方法

    1.导入项目之前,请确认工作空间编码已设置为utf-8:window->Preferences->General->Wrokspace->Text file encoding- ...

  10. Trying to find the anti-derivative of $\tan x$ unsuccessfully by using Euler's formula

    We know that$$\tan t=\frac{e^{it}-e^{-it}}{i(e^{it}+e^{-it})}=\frac{e^{2i    t}+1-2}{i(e^{2it}+1)}=- ...