实现一个简陋的MVC框架
来源:互联网 发布:mac pro 屏幕涂层脱落 编辑:程序博客网 时间:2024/05/17 03:05
参考文章:30行代码实现Javascript中的MVC
MVC过程介绍
用户对View操作以后,View捕获到这个操作,会把处理的权利交移给Controller,Controller对相应的Model进行修改,当Model变更了以后,会通过观察者模式通知View进行更新。这里的关键步骤就是实现观察者模式。
实现过程
- 首先我们要明确我们的目标:实现数组的排序
<input type="button" value="reverse" id="toggleBtn"/><!--页面初始化后,input会显示数组的初始化值,当点击reverse按钮后,显示反转后的数组--><input type="text" data-bind="arr"><!--用于测试多个dom结点绑定同一变量的情况--><input type="text" data-bind="arr">
new Controller(function (model){ var data = [1,2,3,4,5]; //调用set后,绑定了该数据的视图,会做相应的改变 model.arr.set(data); var toggleBtn = document.getElementById('toggleBtn'); toggleBtn.addEventListener('click',function () { //同样会自动更新视图 model.arr.set(data.reverse()); })});
所以,这里关键的地方就是构造一个model对象,在model对象上事先已经绑定了所有的数据和其对应的视图,一旦某一个数据被改变,相应的视图也会进行更新。
2. 设计我们的MVC框架——mvc.js
定义一个观察者模式
function SubPub() { this.value = ""; this.doms = [];}//类似于观察者中的publishSubPub.prototype.set = function (value) { var self = this; selt.value = value; //异步更新队列 setTimeout(function () { self.doms.forEach(function (dom) { dom.value = value.toString(); }) },0)}//类似于观察者中的subscribeSubPub.prototype.bind = function (dom) { this.doms.push(dom);}
function Controller(callback) { var doms = document.querySelectorAll('[data-bind]'); var model= {}; doms.forEach(function (dom) { var data = dom.getAttribute('data-bind'); //可能多个dom结点绑定同一变量 model[data] = model[data] || new SubPub(); model[data].bind(dom); }) callback.call(this,model);}
使用ES5的新特性——Object.defineProperty
上面的代码中,我们修改数据时是这样的:
model.arr.set(data);
不是很自然,可不可换成这样呢:
model.arr = data;
实现这个功能就要用到Object.defineProperty中的set了,这样我们也不需要定义观察者了。
最后我们的mvc.js变成这样:
function Controller(callback) { var model = {}; var doms = document.querySelectorAll('[data-bind]'); doms.forEach(function (dom) { var data = dom.getAttribute('data-bind'); if(model.data===undefined){ model.data = null; var targets = document.querySelectorAll('[data-bind=' + data + ']'); Object.defineProperty(model,data,{ set: function (value) { model.data = value; targets.forEach(function (target) { target.value = value; }) } }) } }) callback.call(this,model);}
0 0
- 实现一个简陋的MVC框架
- 实现一个简陋的双向绑定
- 实现一个简陋的记事本软件
- 一个简陋的makefile
- 如何利用博客实现一个简陋的网络验证
- 一个简陋的文字计数器
- MVC、JSP实现mysql的增删改查功能的封装和简陋的界面交互
- 框架的MVC实现
- 1.写一个Mvc框架_超轻量级MVC框架的设计和实现
- C++实现一个简单的双线程MVC框架
- 一个非常简陋的域名注册辅助工具
- 一个简陋的中文自动分词程序
- 一个简陋的lua调试器
- 一个比较简陋的动态标题栏
- 一个opengl实现的很简陋的双人对战五子棋
- 一个简陋的自定义用线程Thread实现的计时器Timer,可以增加定时时间
- 日志类(常用的都是用log4net,这里简陋地实现一个写入文本日志类)
- Latex编辑功能的简陋实现
- Leetcode 311. Sparse Matrix Multiplication
- hdu5788 level up
- matlab cell保存mat 以及提取
- 异常之Tomcat7.0服务器无法发布项目
- JAVA-SYSTEM/RUNTIME/DATE/CALENDAR
- 实现一个简陋的MVC框架
- 防火墙类型总结
- 全概公式和贝叶斯公式的理解
- struts2文件上传总结
- Jquery 使用Ajax获取后台返回的Json数据后,页面处理
- 定义一个长度大于5,包含字符‘@’的字符串,完成如下操作......(foreach及各种函数的用法)
- Oracle索引(index)
- 行内设置float
- [QT起航] 第三篇——(一)创建对话框