参考文章:30行代码实现Javascript中的MVC

MVC过程介绍

用户对View操作以后,View捕获到这个操作,会把处理的权利交移给Controller,Controller对相应的Model进行修改,当Model变更了以后,会通过观察者模式通知View进行更新。这里的关键步骤就是实现观察者模式。

实现过程

  1. 首先我们要明确我们的目标:实现数组的排序
<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 = [];
}
//类似于观察者中的publish
SubPub.prototype.set = function (value) {var self = this; selt.value = value;//异步更新队列setTimeout(function () {self.doms.forEach(function (dom) {dom.value = value.toString();})},0)
}
//类似于观察者中的subscribe
SubPub.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);
}

实现一个简陋的MVC框架相关推荐

  1. 怎样封装一个自己的mvc框架(七)

    mvc框架封装到了最后一步,我们需要引入一个模板引擎twig 同样修改composer文件,在require中加入一行 "twig/twig":"*" 然后命令 ...

  2. 在Java中搭建一个简单的MVC框架

    搭建一个简单的Java MVC框架 一 . 前言 二. 代码实现 1. 思路分析 2. 代码实现 2.1 Controller注解 2.2 RequestMapping注解 2.3 UserContr ...

  3. 自己动手写一个简单的MVC框架(第二版)

    一.ASP.NET MVC核心机制回顾 在ASP.NET MVC中,最核心的当属"路由系统",而路由系统的核心则源于一个强大的System.Web.Routing.dll组件. 在 ...

  4. 自己动手写一个简单的MVC框架(第一版)

    一.MVC概念回顾 路由(Route).控制器(Controller).行为(Action).模型(Model).视图(View) 用一句简单地话来描述以上关键点: 路由(Route)就相当于一个公司 ...

  5. 仿照源码,手写一个自定义 Spring MVC 框架

    毫无疑问,Spring 框架目前已经成为 Java 开发的行业标准,Spring MVC 作为其 Web 解决方案,是所有 Java 开发者都必须掌握的基本技能,理解其底层原理,才能更好地应用它进行实 ...

  6. 搭建一个简单的MVC框架

    背景 为何要用MVC框架?首先我们知道不用框架的话,在javaweb项目中每个请求都要写一个servlet,并且要在web.xml中对每个servlet类的映射作配置,不方便开发,因此引入MVC框架. ...

  7. 学写一个 Java Web MVC 框架(一)

    当前我们介绍的是一个简单的MVC,用8个类即实现完整Spring MVC核心功能,外加其他实用的小功能.它是怎么实现的呢?让我们来一探究竟! 源码在:https://gitee.com/sp42_ad ...

  8. 学写一个 Java Web MVC 框架(四)

    访问请求处理 当客户端发送一个请求,被自定义的过滤器MvcDispatcher拦截,解析请求地址和参数对象跳转到一个控制器的方法中,然后执行进行逻辑处理后返回响应内容给MvcDispatcher输出, ...

  9. springmvc请求返回一个字符_Spring MVC框架详解01

    SpringMVC是Spring框架的一个模块,Spring和SpringMVC无需通过中间整合层进行整合.SpringMVC是基于MVC架构的WEB框架,SpringMVC与Spring是父子容器之 ...

最新文章

  1. Python字符串居然可以这样玩 到底怎么做到的 年薪50w程序员揭晓
  2. 物体的三维识别与6D位姿估计:PPF系列论文介绍(五)
  3. Java NIO框架Netty教程(一) – Hello Netty
  4. pydev集成mysql_【Python】Windows平台下Python、Pydev连接Mysql数据库
  5. MySQL常用语法记录
  6. 《程序员代码面试指南》第一章 栈和队列 设计一个有getMin功能的栈
  7. python dict遍历_Python教程:Python数据类型之字典(附学习教程)
  8. 【机器学习】逻辑回归原理及其实现
  9. 阶段1 语言基础+高级_1-3-Java语言高级_06-File类与IO流_04 IO字节流_8_字节输入流_InputStream类FileInputStream...
  10. SSIS中的字符映射表转换组件
  11. 编译Notepad2语法高亮记事本源码心得
  12. QQ输入法 for iPhone2.3
  13. dx逆向建模步骤_什么是3D打印?游戏建模具体是什么的?哪个更有发展
  14. 深入理解Java枚举类型(enum)
  15. 卷组删除pv_LVM 移除PV步骤
  16. 关于C语言的随机函数
  17. lol服务器维护是拳头,问拳头-英雄联盟官方网站-腾讯游戏
  18. 梆梆加固的病毒分析-破解篇
  19. [转]144P /240P/360P/480P/720P/1080P分辨率的差别
  20. 最新计算机ppt,计算机应用基础(最新版)ppt课件

热门文章

  1. Gitlab的branch与Tag的使用
  2. java课程培训中心
  3. Bert代码详解及模型介绍
  4. jjava企业级开发-01
  5. 简单工厂、工厂方法、抽象工厂
  6. linux安装java视频_linux安装java(zz)
  7. jQuery下(2nd)
  8. 分治、CDQ分治小结
  9. klee-2.1安装(按照这个博客,闭着眼都能成功!)
  10. pcs增加mysql资源_PCS --- 常用命令及配置