“写的不是代码,是你的思维”,经常觉得自己写的代码“皮粗肉糙”的,看到那些要么精致小巧,要么优雅大方,要么光明磊落的代码时,常常会黯然神伤外加垂涎欲滴。

  why?(为什么我的代码不能如此。。)

  when?(什么时候我的代码能有此质量)

  what?(我要怎么做?)

  此时我的回答是:静下心来,多思考,多实践。(老李, 。。。。。说好的魂淡要做到)

  今天想重新思考实践一下MVC

开场啦。。。。。。

//模型

//封装与应用程序的业务逻辑相关的数据以及数据的处理方法。模型不依赖“视图”和“控制器”//当model发生变化是时,通知它的监听者

function ListModel(items){

  this._items = items;

  this._selectedIndex = -1;

  this.itemAdded = new Event(this);

  this.itemRemoved = new Event(this);

  this.selectedIndexChanged = new Event(this);

}

ListModel.prototype = {

  getItems: function(){

    return [].concat(this._items);

  },

  addItem: function(item){

    this._items.push(item);

    this.itemAdded.notify({item:item});

  },

  removeItemAt: function(index){

    var item;

    item = this._items[index];

    this._items.splice(index, 1);

    this.itemRemoved.notify({item:item});

    if(index === this._selectedIndex){

      this.setSelectedIndex(-1);

    }

  },

  getSelectedIndex: function(){

    return this._selectedIndex;

  },

  setSelectedIndex: function(index){
            var previousIndex;
            previousIndex = this._selectedIndex;
            this._selectedIndex = index;
            this.selectedIndexChanged.notify({previous: previousIndex});
     }

};

function Event(sender){
            this._sender = sender;
            this._listeners = [];
        }
        Event.prototype = {
            attach: function(listener){
                this._listeners.push(listener);
            },
            notify: function(args){
                var index;
                for(index=0;index<this._listeners.length;index +=1){
                    this._listeners[index](this._sender, args);
                }
            }
        };

  //视图
        //视图显示模型数据,并触发模型数据。控制器用来处理这些用户交互事件
        function ListView(model, elements){
            this._model= model;
            this._elements = elements;

this.listModified = new Event(this);
            this.addButtonClicked = new Event(this);
            this.delButtonClicked = new Event(this);

var _this = this;
            //绑定模型监听器
            this._model.itemAdded.attach(function(){
                _this.rebuildList();
            });
            this._model.itemRemoved.attach(function(){
                _this.rebuildList();
            });

//将监听器绑定到HTML控件上
            this._elements.list.change(function(e){
                _this.listModified.notify({index: e.target.selectedIndex});
            });
            this._elements.addButton.click(function () {  
                _this.addButtonClicked.notify();  
            });  
        
            this._elements.delButton.click(function () {  
                _this.delButtonClicked.notify();  
            });

}
        ListView.prototype = {
            show: function(){
                this.rebuildList();
            },
            rebuildList: function(){
                var list, items, key;
                list = this._elements.list;
                list.html("");

items = this._model.getItems();
                for(key in items){
                    if(items.hasOwnProperty(key)){
                        list.append($("<option>"+items[key]+"</option>"));
                    }
                }
                this._model.setSelectedIndex(-1);
            }
        };

//控制器
        //控制器响应用户操作,调用模型上的变化函数
        function ListController(model, view){
            this._model = model;
            this._view = view;

var _this = this;
             this._view.listModified.attach(function (sender, args) {  
                _this.updateSelected(args.index);  
            });  
        
            this._view.addButtonClicked.attach(function () {  
                _this.addItem();  
            });  
        
            this._view.delButtonClicked.attach(function () {  
                _this.delItem();  
            });

}
        ListController.prototype = {
            addItem: function(){
                var item = window.prompt('Add item:','');
                if(item){
                    this._model.addItem(item);
                }
            },
            delItem: function(){
                var index;
                index = this._model.getSelectedIndex();
                if(index!== -1){
                    this._model.removeItemAt(this._model.getSelectedIndex());
                }
            },
            updateSelected: function(index){
                this._model.setSelectedIndex(index);
            }
        };

//}());

  //测试用例
    $(function () {
            var model = new ListModel(['PHP', 'JavaScript']),

view = new ListView(model, {
                'list' : $('#list'),
                'addButton' : $('#plusBtn'),
                'delButton' : $('#minusBtn')
            }),

controller = new ListController(model, view);        
            view.show();
        });

javascript MVC(每天有学习一点篇)的更多相关文章

  1. javascript解析引擎(每天有学习一点篇)

    ======================================================= 有一段时间,经常耳闻web前端的福音,对高性能的V8议论纷纷. 其实对js解析引擎没有深 ...

  2. DOM编程(每天有学习一点篇)

    每次想到“DOM”编程就会自然联想到“性能瓶颈”.我觉得有两部分原因: 1.DOM自己本身操作代价昂贵,因为浏览器通常要求DOM 实现和JavaScript 实现保持相互独立: 2.嘿嘿,本人自身的原 ...

  3. ASP.NET MVC Web API 学习笔记---第一个Web API程序

    http://www.cnblogs.com/qingyuan/archive/2012/10/12/2720824.html GetListAll /api/Contact GetListBySex ...

  4. JavaScript MVC框架PK:Angular、Backbone、CanJS与Ember

    国内私募机构九鼎控股打造APP,来就送 20元现金领取地址:http://jdb.jiudingcapital.com/phone.html内部邀请码:C8E245J (不写邀请码,没有现金送)国内私 ...

  5. JavaScript MVC框架PK:Angular、Backbone、CanJS与Ember(转载)

    原文地址:http://sporto.github.io/.../comparison-angular-backbone-can-ember/ 原文作者:Sebastian Porto @Twitte ...

  6. MVC系列——MVC源码学习:打造自己的MVC框架(二:附源码)

    前言:上篇介绍了下 MVC5 的核心原理,整篇文章比较偏理论,所以相对比较枯燥.今天就来根据上篇的理论一步一步进行实践,通过自己写的一个简易MVC框架逐步理解,相信通过这一篇的实践,你会对MVC有一个 ...

  7. MVC系列——MVC源码学习:打造自己的MVC框架(一:核心原理)

    前言:最近一段时间在学习MVC源码,说实话,研读源码真是一个痛苦的过程,好多晦涩的语法搞得人晕晕乎乎.这两天算是理解了一小部分,这里先记录下来,也给需要的园友一个参考,奈何博主技术有限,如有理解不妥之 ...

  8. MVC缓存OutPutCache学习笔记 (二) 缓存及时化VaryByCustom

    <MVC缓存OutPutCache学习笔记 (一) 参数配置> 本篇来介绍如何使用 VaryByCustom参数来实现缓存的及时化.. 根据数据改变来及时使客户端缓存过期并更新.. 首先更 ...

  9. 【JavsScript】JavaScript MVC 框架技术选型

    你很喜欢Gmail和Trello之类的单页面应用,但是不太确定该从何开始.也许你的JavaScript代码是如此的杂乱无章,以致于你很想在下一个项目上尝试下JavaScript MVC库和框架,却苦于 ...

随机推荐

  1. css3隔行变换色实现示例

    <style>#list1 li:nth-of-type(odd){ background:#00ccff;}/*奇数行*/ #list1 li:nth-of-type(even){ ba ...

  2. Android M新特性之Permissions

    User does not have to grant any permissions when they install or upgrade the app. Instead, the app r ...

  3. 升级设置win2008r2开发环境,遇到问题小结

    升级设置2008r2开发环境,是一般程序员经历的事情.许多从vs 2003,vs2005+sql2000+win2003过来,但是,时间推移,技术革新,64位的推行.架构的变化和强大.我们也只可以学习 ...

  4. UIRefreshControl自动刷新

    不知道UIRefreshController是什么的朋友可以参考iOS6新特征:UIRefreshControl[下拉刷新]使用示例 一文了解这是什么,这里只提怎么使用代码的方式触发UIRefresh ...

  5. 开启PHP exif扩展方法详解

    服务器配置说明: 1.在php.ini文件中找到;extension=php_exif.dll,去掉前面的分号2.在php.ini文件中找到;extension=php_mbstring.dll,去掉 ...

  6. 关于jsonp跨域过程中 cookie中的值一直为null的原因

    今天技术交流群里的小伙伴一直被一个问题而困扰,就是写入cookie里面的值 再次进行请求时 cookie 就为空了 他被问题纠结了一天  我也好奇了一天 终于在快下班的时候 他解决掉了 下面我来收一个 ...

  7. PTA作业

  8. Error Handling

    Use Exceptions Rather Than Return Codes Back in the distant past there were many languages that didn ...

  9. 传智播客JavaWeb day02笔记

    2015年1月21日 今天的主要内容:介绍了几款常用Javaweb服务器,重点介绍了tomcat以及tomcat的安装和怎么样检测安装成功 1.JavaWeb常见服务器 Tomcat(免费但是只支持部 ...

  10. java中的transient关键词

    以下内容全部参考自:http://www.cnblogs.com/lanxuezaipiao/p/3369962.html,有些直接复制了. 1. transient的作用 实体类实现了Seriliz ...