标题党。几天前看到一个30行写mvc的文章,东施效颦,也动手写了个60行的,功能上略微扩充一些,记录下来,后面有时间可以继续优化。

mvc其实是一个观察者模式。view来监听model,所以当model的数据有变化的时候,view可以自动更新视图。

既然view来监听model,那么是不是可以扩展一下,如果页面上多个模块同时使用一个数据源,也就是同时使用一个model的时候,是否可以让这些模块的

view都来监听这一个model,这样当model的数据发生变化时,监听该model的views们 视图同时也都发生了变化呢,肯定是可以的。

根据这个思路,花了差不多两个晚上的时间,写完了一个基本的雏形。

先看model。

  1. function Model (value) {
  2. this.value = value || '';
  3. // idList保存的是 监听该model的view的id, 该idList示例:[{viewid1: {event1: function(){.....}}},{viewid2: {}}]
  4. this.idList = [];
  5. };
  6.  
  7. // 当model的数据变化的时候,监听model的view发生对应的变化
  8. Model.prototype.changeValue = function (value) {
  9. var that = this;
  10. that.value = value;
  11. var idList = that.idList;
  12.  
  13. for (var k in idList) {
  14. if (idList[k]) {
  15. for (var j in idList[k]) {
  16. idList[k][j].call(this, value);
  17. }
  18. }
  19. }
  20. };

下面是view

  1. function View (id, eventList) {
  2. this.id = id;
  3. this.eventList = eventList || {};
  4. }
  5. // view基于model的事件,当model的数据变化时,view会通过这些事件
  6. // 进行视图的改变
  7. View.prototype.setEventList = function (eventList, model) {
  8. var that = this;
  9. that.eventList = eventList;
  10. that.subscribeModel(model);
  11. };
  12. // view订阅model 这样可以保证多个view公用一个model
  13. View.prototype.subscribeModel = function (model) {
  14. var that = this;
  15. var id = that.id;
  16. model.idList[id] = that.eventList;
  17. };

view里面并没有什么过于复杂的原理。

最后是controller,其实这个controller 可扩展性是很强的,因为只是简单的练习,controller里我并没有加太多的东西。

  1. function Controller (model, view) {
  2. this.model = model;
  3. this.view = view;
  4. }
  5.  
  6. Controller.prototype.trigger = function () {
  7. this.view.subscribeModel(this.model);
  8. };

写了点html实验一下 OK的

  1. // 以下是测试的代码
  2. var view = new View ('block', {
  3. 'changeContent': function (data) {
  4. document.getElementById('block').innerHTML = data;
  5. }
  6. });
  7.  
  8. var model = new Model();
  9.  
  10. var controller = new Controller(model, view);
  11. controller.trigger();
  12.  
  13. model.changeValue('data111');

这里是有个问题的,就是当model里有默认的数据时,是没有去渲染view的,后续可以再修改。

通过这个简单的例子,主要是更加清楚model和view的关系。目前机遇mv的架构有很多,但基本原理都是一样的。

60行以内写mvc的更多相关文章

  1. 60行自己动手写LockSupport是什么体验?

    60行自己动手写LockSupport是什么体验? 前言 在JDK当中给我们提供的各种并发工具当中,比如ReentrantLock等等工具的内部实现,经常会使用到一个工具,这个工具就是LockSupp ...

  2. 教你看懂网上流传的60行JavaScript代码俄罗斯方块游戏

    早就听说网上有人仅仅用60行JavaScript代码写出了一个俄罗斯方块游戏,最近看了看,今天在这篇文章里面我把我做的分析整理一下(主要是以注释的形式). 我用C写一个功能基本齐全的俄罗斯方块的话,大 ...

  3. 60行JavaScript代码俄罗斯方块

    教你看懂网上流传的60行JavaScript代码俄罗斯方块游戏   早就听说网上有人仅仅用60行JavaScript代码写出了一个俄罗斯方块游戏,最近看了看,今天在这篇文章里面我把我做的分析整理一下( ...

  4. 源码分析系列 | 从零开始写MVC框架

    1. 前言 2. 为什么要自己手写框架 3. 简单MVC框架设计思路 4. 课程目标 5. 编码实战 5.1 配置阶段 web.xml配置 config.properties 自定义注解 5.2 初始 ...

  5. Python10行以内代码能有什么高端操作

    Python10行以内代码能有什么高端操作 Python凭借其简洁的代码,赢得了许多开发者的喜爱.因此也就促使了更多开发者用Python开发新的模块,从而形成良性循环,Python可以凭借更加简短的代 ...

  6. 大家一起写mvc(三)_结束

    上一篇介绍到要写mvc的所用的核心技术,这一篇我们就开始真正的开始写mvc,其实就是把昨天写过的代码进行一些组装就可以了. 我们用eclipse新建一个web项目.然后web.xml如下 <?x ...

  7. 大家一起写mvc(二)

    上一篇已经看了,我想大家都明白了mvc的原理,今天我们来说一下要写自己mvc框架必须要会的技术. mvc的目录是这样的 src目录是我们核心的mvc代码.这个代码明天讲,今天主要讲的代码都在test目 ...

  8. python实战:用70行代码写了一个山炮计算器!

    python实战训练:用70行代码写了个山炮计算器! 好了...好了...各位因为我是三年级而发牢骚的各位伙伴们,我第一次为大家插播了python的基础实战训练.这个,我是想给,那些python基础一 ...

  9. 使用C#重写网上的60行 Javascript 俄罗斯方块源码 (带注释)

    在很久很久以前,就已经看过 60行Js的俄罗斯方块源码.无奈当时能力不够看明白,当时觉得就是个神作. 现在总算有空再看了,顺便用c#实现一遍(超过60行),顺道熟悉下Js API. 网上其他博客也有分 ...

随机推荐

  1. iOS UIButton setTitle与setAttributedTitle

    今天遇到一个问题,查了好久,终于解决. 我需要根据不同的条件给uibutton赋不同的值,由于字体要求有不同颜色变化,所以我选择了一个条件下用setTitle,另一个条件下用setAttributed ...

  2. android 设置状态栏与标题背景颜色一致

    必须在Android4.4以上版本才能设置状态栏颜色: 一.在单个Activity里面,设置状态栏的背景: 效果: 1.在Activity的布局根文件中添加属性: android:fitsSystem ...

  3. 在filter中使用spring的service bean

    http://blog.csdn.net/godha/article/details/13025099

  4. 【Python全栈笔记】03 [模块二] 16-17 Oct Set 集合,三目运算

    Set 集合 set - unordered collections of unique elements 创建一个set/一个空set # create a new set set1 = {1,2, ...

  5. android 常见分辨率(mdpi、hdpi 、xhdpi、xxhdpi )及屏幕适配注意事项

    1 Android手机目前常见的分辨率 1.1 手机常见分辨率: 4:3VGA     640*480 (Video Graphics Array)QVGA  320*240 (Quarter VGA ...

  6. Android控件Gridview实现仿支付宝首页,Fragment底部按钮切换和登录圆形头像

    此案例主要讲的是Android控件Gridview(九宫格)完美实现仿支付宝首页,包含添加和删除功能:Fragment底部按钮切换的效果,包含四个模块,登录页面圆形头像等,一个小项目的初始布局. 效果 ...

  7. 1_UILabel

    // // ViewController.swift // 1_UILabel // // Created by Larry on 2016/12/7. // Copyright © 2016年 nf ...

  8. 转:fatal error: SDL/SDL.h: No such file or directory

    Ubuntu的新得立已经包含SDL库,所以通过几个简单的命令就可以安装,比windows还傻瓜! sudo apt-get install libsdl1.2-dev(比较大,10M左右) 附加包: ...

  9. 读《UNIX编程艺术》一感

    我记得早在2006年的时候就开始频繁使用awk做文本处理方面的工作,07年的时候周围有人用perl,我还感到很不解,觉得写得很复杂,没有awk one liner 那么方便和神奇.一直在了解awk的具 ...

  10. NHibernate 映射失败 is not mapped

    1 区分大小写(实体类名) 2 MAP的XML设置为嵌入的资源 3 hibernate.cfg.xml配置添加map的程序集<mapping assembly="Model" ...