MVC in Javascript

From

http://www.cnblogs.com/tugenhua0707/p/5156179.html

原博的比我详细 我是以自己的惯用的方式实现了一下

MVC就是各尽自己的职责,整个视图都是按照数据来渲染的, 视图本身并不保存数据。 发生的事件由Controller控制, Controller也是修改Model中的数据, 之后调用View中的refreshDOM刷新DOM


var doc = document;
var PubSub = function(){
this.event = [];
}
PubSub.prototype = {
registerEvent: function(fn){
this.event.push(fn);
},
triggerEvent: function(){
this.event.forEach(function(fn){
fn.call(this);
}.bind(this));
}
} var Model = function(list){
this.list = list;
this.addEvent = new PubSub();
this.delEvent = new PubSub();
}
Model.prototype = {
addItem: function(item){
if(item){
this.list.push(item);
}else{
var lastData = self.model.list[self.model.list.length-1];
var num = +lastData.match(/item(\d)/)[1];
this.list.push('item'+(num+1));
}
},
removeItem: function(index){
this.list.splice(index,1);
}
}
var View = function(model,container){
var self = this;
this.model = model;
this.container = container;
this.model.addEvent.registerEvent(function(){
self.model.addItem();
self.refreshDOM();
});
this.model.delEvent.registerEvent(function(){
if(self.container.selectedIndex != -1){
self.model.removeItem(self.container.selectedIndex);
self.refreshDOM();
}
});
this.refreshDOM = function(){
var listData = this.model.list;
var selectElem = doc.querySelector('#list');
selectElem.innerHTML = '';
listData.forEach(function(item){
var option = doc.createElement('option');
option.value = item;
option.innerHTML = item;
self.container.appendChild(option);
});
}
}
var Controller = function(elements, model){
var self = this;
this.addButton = elements.addButton;
this.delButton = elements.delButton;
this.model = model;
this.addButton.addEventListener('click', function(){
self.model.addEvent.triggerEvent();
});
this.delButton.addEventListener('click', function(){
self.model.delEvent.triggerEvent();
})
}
var model = new Model(['item1','item2']);
var view = new View(model, doc.querySelector('#list'));
view.refreshDOM();
var controller = new Controller({
addButton: doc.querySelector('#addBtn'),
delButton: doc.querySelector('#delBtn')
},model)

MVC in Javascript的更多相关文章

  1. 试读《基于MVC的JavaScript Web富应用开发》— 不一样的JavaScript

    前言 <基于MVC的JavaScript Web富应用开发>是ItEye在7月份发起试读的书.下载了试读的章节,发现只有全本的开始到第二章,第一章很简洁明了地讲述了JavaScript的历 ...

  2. 《基于MVC的JavaScript Web富应用开发》学习笔记

    第1章 MVC和类 1. 什么是MVC? MVC是一种设计模式, 它将应用划分为3个部分: 数据(模型, Model), 展现层(视图, View) 和用户交互层(控制器, Controller). ...

  3. 再读<<基于MVC的JavaScript Web 富应用开发>>

    工作的时候粗读过这本书的几章内容,真真是囫囵吞枣~~目前手边就剩这一本,重新读才觉得先前是没看明白啊!这个作者博闻强识,对这些插件.库了解的非常多.记录下,查的资料 订阅/发布 jQuery Tiny ...

  4. asp.net mvc页面javascript代码中如何使用razor

    我们需要用<text>将javascript代码包含起来,强制让razor编译器回到内容模式, 或者将javascript代码放在函数中,让razor编译器可以识别,请看下面两个例子: & ...

  5. 试读《基于MVC的JavaScript Web富应用开发》

    前两年做jsp开发时,用了不少JavaScript(JS)和Ajax, 最近的项目一直在使用Flex做前台,虽然也有类似的ActionScript实现JS的功能,但没想到的是,短短几年JS发展如此迅速 ...

  6. ASP.NET MVC 中使用JavaScriptResult asp.net mvc 返回 JavaScript asp.mvc 后台返回js

    return this.Content("<script>alert('暂无!');window.location.href='/Wap/Index';</script&g ...

  7. MVC中JavaScript和CSS的自动打包与压缩

    在程序中安装System.Web.Optimization程序集 依赖关系如下图所示: 添加BundleConfiguration类 代码如下所示 注意必须使用对应的ScriptBundle和Styl ...

  8. Asp.net MVC CSS/Javascript Bundle 配置文件

    Asp.net mvc 中使用 Web Optimization 可以合并.压缩JS和CSS文件,但是每次修改都要改代码 ~/App_Start/BundleConfig.cs ,遂有了将它挪到配置文 ...

  9. [已读]基于MVC的Javascript Web 富应用开发

    这本书是12年出版,我买的时间应该是13年,书架上唯一一本盗版→ → 但是看完是在今年. 因为刚拿到的时候,读起来很是磕磕绊绊,就搁置了蛮久.到第二次拿起来的时候,发现已经有部分内容过时,但我还是觉得 ...

随机推荐

  1. C语言-getopt函数

    #include<unistd.h> int getopt(int argc,char *const argv[],const char *optstring); extern char ...

  2. select语句后面加上for update的作用

    Select…For Update语句的语法与select语句相同,只是在select语句的后面加FOR UPDATE [NOWAIT]子句. 该语句用来锁定特定的行(如果有where子句,就是满足w ...

  3. 关于淘宝的数据来源,针对做淘宝客网站的淘宝api调用方法

    上次写了个淘宝返利模式的博客,直接被移除首页,不知道何故啊.可能是真的跟技术不太刮边. 众所周知,能够支撑一个网站运营的最基础不是程序写的多么好.也不是有多么牛X的运营人员,最主要的是数据,如果没有数 ...

  4. JSON基础学习

    定义 JSON时轻量级的文本数据交换格式,独立于语言,比xml更小更快更易解析 JSON解析器和JSON库支持不同的编程语言 4个基本规则 1. 并列数据间用 逗号, 2. 映射用冒号表示 3. 并列 ...

  5. 【python】中文的输出,打印,文件编码问题解决方法

    直接在python中输入中文的字符串会报编译错误SyntaxError: Non-ASCII character,因为python文件默认编码方式是ASCII.如果想要打印中文字符,有两种方式: 1. ...

  6. OpenWRT交叉编译

    对于当前不在OpenWRT repository中的软件,如果是用源码形式发布的,那么可以用OpenWRT Buildroot进行交叉编译. 首先编译好Buildroot(一般编译过一次固件,就已经编 ...

  7. Amazon 解决下载文件乱码

    大家在做多个站点的时候,可能会遇到下载下来的报告文件出现乱码. 法国站点和意大利站点均会出现这样的情况,那怎么解决呢? 这是由于编码的问题而导致,在我们读取数据插入到本地数据库的时候,不妨先将格式转成 ...

  8. delphi 获取北京时间(使用XMLHTTP获取百度的时间,WebBrowser获取www.timedate.cn的时间)

    方法一: uses ComObj, DateUtils; function GetInternetTime: string; var XmlHttp: OleVariant; datetxt: str ...

  9. android邮件发送几种方式

    android中发送邮件我大概发现了3种,代码如下 package src.icetest; import org.apache.commons.mail.EmailException; import ...

  10. android 读取txt文件内容

    Android的res文件夹是用来存储资源的,可以在res文件夹下建立一个raw文件夹,放置在raw文件夹下的内容会被原样打包,而不会被编译成二进制文件,并且可以通过R文件进行很方便地访问. 比如我们 ...