亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 編程 > JavaScript > 正文

理解javascript中的MVC模式

2019-11-20 10:39:53
字體:
來源:轉載
供稿:網友

MVC模式是軟件工程中一種軟件架構模式,一般把軟件模式分為三部分,模型(Model)+視圖(View)+控制器(Controller);

模型:模型用于封裝與應用程序的業務邏輯相關的數據以及對數據處理的方法。模型有對數據直接訪問的權利。模型不依賴 “視圖” 和 “控制器”, 也就是說 模型它不關心頁面如何顯示及如何被操作.

視圖:視圖層最主要的是監聽模型層上的數據改變,并且實時的更新html頁面。當然也包括一些事件的注冊或者ajax請求操作(發布事件),都是放在視圖層來完成。

控制器:控制器接收用戶的操作,最主要是訂閱視圖層的事件,然后調用模型或視圖去完成用戶的操作;比如:當頁面上觸發一個事件,控制器不輸出任何東西及對頁面做任何處理; 它只是接收請求并決定調用模型中的那個方法去處理請求, 然后再確定調用那個視圖中的方法來顯示返回的數據。

下面我們來實現一個簡單的下拉框控件,我們可以對它進行增刪操作;如下圖所示:

代碼如下:

/* 模型用于封裝與應用程序的業務邏輯相關的數據以及對數據處理的方法。模型有對數據直接訪問的權利。 模型不依賴 "視圖" 和 "控制器", 也就是說 模型它不關心頁面如何顯示及如何被操作.*/function Mode(elems) {  // 所有元素  this._elems = elems;   // 被選中元素的索引  this._selectedIndex = -1;   // 增加一項  this.itemAdd = new Event(this);   // 刪除一項  this.itemRemoved = new Event(this);   this.selectedIndexChanged = new Event(this);} Mode.prototype = {   constructor: 'Mode',   // 獲取所有的項  getItems: function(){    return [].concat(this._elems);  },  // 增加一項  addItem: function(elem) {    this._elems.push(elem);    this.itemAdd.notify({elem:elem});  },  // 刪除一項  removeItem: function(index) {    var item = this._elems[index];    this._elems.splice(index,1);    this.itemRemoved.notify({elem:item});     if(index === this._selectedIndex) {      this.setSelectedIndex(-1);    }  },  getSelectedIndex: function(){    return this._selectedIndex;  },  setSelectedIndex: function(index){    var previousIndex = this._selectedIndex;    this._selectedIndex = index;    this.selectedIndexChanged.notify({previous : previousIndex});  }};/* 下面是觀察者模式類,它又叫發布---訂閱模式;它定義了對象間的一種一對多的關系, 讓多個觀察者對象同時監聽某一個主題對象,當一個對象發生改變時,所有依賴于它的對象都將得到通知。*/function Event(observer) {  this._observer = observer;  this._listeners = [];}Event.prototype = {  constaructor: 'Event',  attach : function(listeners) {    this._listeners.push(listeners);  },  notify: function(objs){    for(var i = 0,ilen = this._listeners.length; i ) {      this._listeners[i](this._observer,objs);    }  }}; /* * 視圖顯示模型數據,并觸發UI事件。 */function View(model,elements){  this._model = model;  this._elements = elements;   this.listModified = new Event(this);  this.addButtonClicked = new Event(this);  this.delButtonClicked = new Event(this);  var that = this;   // 綁定模型監聽器  this._model.itemAdd.attach(function(){    that.rebuildList();  });  this._model.itemRemoved.attach(function(){    that.rebuildList();  });   // 將監聽器綁定到HTML控件上  this._elements.list.change(function(e){    that.listModified.notify({index: e.target.selectedIndex});  });  // 添加按鈕綁定事件  this._elements.addButton.click(function(e){    that.addButtonClicked.notify();  });  // 刪除按鈕綁定事件  this._elements.delButton.click(function(e){    that.delButtonClicked.notify();  });}View.prototype = {  constructor: 'View',  show: function(){    this.rebuildList();  },  rebuildList: function(){    var list = this._elements.list,      items,      key;    list.html("");    items = this._model.getItems();    for(key in items) {      if(items.hasOwnProperty(key)) {        list.append('' +items[key]+ '');      }    }    this._model.setSelectedIndex(-1);  }};/* 控制器響應用戶操作,調用模型上的變化函數 負責轉發請求,對請求進行處理*/function Controller(model,view) {  this._model = model;  this._view = view;  var that = this;   this._view.listModified.attach(function(sender,args){    that.updateSelected(args.index);  });  this._view.addButtonClicked.attach(function(){    that.addItem();  });  this._view.delButtonClicked.attach(function(){    that.delItem();  });}Controller.prototype = {  constructor: 'Controller',   addItem: function(){    var item = window.prompt('Add item:', '');    if (item) {      this._model.addItem(item);    }  },   delItem: function(){    var index = this._model.getSelectedIndex();    if(index !== -1) {      this._model.removeItem(index);    }  },   updateSelected: function(index){    this._model.setSelectedIndex(index);  }};

HTML代碼如下:

<select id="list" size="10" style="width: 10rem">select>br/><button id="plusBtn"> + button><button id="minusBtn"> - button>

頁面初始化代碼如下:

$(function () {  var model = new Mode(['PHP', 'JavaScript']),   view = new View(model, {    'list' : $('#list'),     'addButton' : $('#plusBtn'),     'delButton' : $('#minusBtn')    }),    controller = new Controller(model, view);        view.show();});

代碼分析如下:

  先分析下我們是要實現什么樣的功能,基本功能有:

一個下拉框,通過用戶輸入的操作來實現用戶增加一項及用戶選中一項后刪除一項的功能;
當然也添加了用戶切換到那一項的事件;

比如我們現在來增加一條數據的時候,在視圖層上添加監聽事件,如下代碼:

// 添加按鈕綁定事件this._elements.addButton.click(function(e){  that.addButtonClicked.notify();});

然后調用觀察者類Event中的方法notify(發布一個事件) that.addButtonClicked.notify();大家都知道,觀察者模式又叫發布-訂閱模式,讓多個觀察者對象同時監聽某一個主題對象,當某一個主題對象發生改變的時候,所有依賴它的對象都會得到通知;
因此在控制層(Controller)我們可以使用如下代碼對發布者進行監聽操作:

this._view.addButtonClicked.attach(function(){  that.addItem();});

之后調用自身的方法addItem();代碼如下:

addItem: function(){  var item = window.prompt('Add item:', '');  if (item) {    this._model.addItem(item);  }}

調用模型層(model)的方法addItem();把一條數據插入到select框里面去;model(模型層)的addItem()方法代碼如下:

// 增加一項addItem: function(elem) {  this._elems.push(elem);  this.itemAdd.notify({elem:elem});},

如上代碼 增加一項后,通過 this.itemAdd 發布一個消息,然后在視圖層(View)上通過如下代碼來監聽這個消息;代碼如下:

// 綁定模型監聽器this._model.itemAdd.attach(function(){   that.rebuildList();});

最后監聽到模型上(Model)的數據發生改變后,及時調用自身的方法rebuildList()去更新頁面上的數據;

模型層(Model)最主要做業務數據封裝操作。視圖層(View)主要發布事件操作及監聽模型層上的數據,如果模型層上有數據改變的時候,及時更新頁面操作,最后顯示給頁面上來,控制層(Controller)主要監聽視圖層(View)的事件,調用模型層(Model)的方法來更新模型上的數據,模型層數據更新后,會發布一條消息出去,最后視圖層(View)通過監聽模型層(Model)的數據變化,來更新頁面的顯示; 如上是MVC的基本流程。
MVC的優點:
        1. 耦合性低:視圖層和業務層分離了,如果頁面上顯示改變的話,直接在視圖層更改即可,不用動模型層和控制層上的代碼;也就是視圖層 與 模型層和控制層
已經分離了;所以很容易改變應用層的數據層和業務規則。
        2. 可維護性:分離視圖層和業務邏輯層也使得WEB應用更易于維護和修改。
MVC的缺點:
        個人覺得適合于大型項目,對于中小型項目并不適合,因為要實現一個簡單的增刪改操作,只需要一點點JS代碼,但是MVC模式代碼量明顯增加了。
對于學習成本也就提高了,當然如果使用一些封裝好的MVC庫或者框架就好了。

以上就是關于javascript中的MVC模式實現方法,優缺點的詳細分析,希望對大家的學習有所幫助。

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
亚洲毛片一区二区| 2019国产精品自在线拍国产不卡| 日韩成人中文字幕| 久久久成人精品视频| 欧美成人免费小视频| 国产视频福利一区| 亚洲视频自拍偷拍| 国产精品天天狠天天看| 欧美极品少妇xxxxⅹ裸体艺术| 亚洲色图35p| 日韩免费在线播放| 欧美在线影院在线视频| 色噜噜狠狠色综合网图区| 日本精品久久久| 日韩美女视频免费在线观看| 国产精品嫩草视频| 国产精品久久久久久久久免费| 久久影视免费观看| 美日韩丰满少妇在线观看| 久久综合九色九九| 国产亚洲欧美视频| 亚洲有声小说3d| 欧美成人一区在线| 国产精品av在线播放| 日韩美女在线看| 欧美日韩国产精品一区| 欧美不卡视频一区发布| 日韩视频中文字幕| 亚洲自拍小视频免费观看| 欧美日韩aaaa| 欧美成人激情图片网| 97在线视频免费| 精品美女永久免费视频| 国产精品久久久久久久久久久不卡| 久久的精品视频| 亚洲最大的成人网| 国产91在线视频| 自拍偷拍亚洲区| 亚洲最大的成人网| 91精品国产自产在线老师啪| 一区二区三区回区在观看免费视频| 日韩成人在线视频| 成人黄色在线播放| 欧美激情在线播放| 精品亚洲一区二区| 日韩成人xxxx| 久久中文字幕视频| 91精品视频播放| 日韩中文视频免费在线观看| www.色综合| 啪一啪鲁一鲁2019在线视频| 欧美在线免费看| 日韩av影院在线观看| 国产精品视频最多的网站| 国产精品wwwwww| 韩国日本不卡在线| 日韩高清电影好看的电视剧电影| 欧美理论电影在线观看| 91免费版网站入口| 成人淫片在线看| 色综合五月天导航| 欧美在线视频在线播放完整版免费观看| 欧美成人免费大片| 国产精品久久久久久久久| 91色p视频在线| 国产精品99导航| 亚洲r级在线观看| 精品国产网站地址| 国产一区二区三区免费视频| 色偷偷av亚洲男人的天堂| 久久久国产精品免费| 国产精品永久免费在线| 最新91在线视频| 欧美性猛交xxxx久久久| 国模私拍视频一区| 日本韩国欧美精品大片卡二| 亚洲一品av免费观看| 国产精品日日摸夜夜添夜夜av| 在线电影中文日韩| 国产精品入口尤物| 2019最新中文字幕| 久久亚洲成人精品| 亚洲第一福利视频| 超碰日本道色综合久久综合| 大胆人体色综合| 日韩在线视频线视频免费网站| 国产亚洲精品一区二区| 中文字幕久热精品在线视频| 日韩视频免费在线| 亚洲一区二区在线| 91视频九色网站| 精品久久久久久亚洲国产300| 九九九久久国产免费| 九九热精品视频国产| 久久久久久亚洲精品| 日韩精品在线电影| 国产精品99久久久久久白浆小说| 欧美成人精品激情在线观看| 国产精品久久久久秋霞鲁丝| 最新中文字幕亚洲| 亚洲毛片在线观看.| 国产成人av网址| 亚洲香蕉伊综合在人在线视看| 欧美日韩亚洲激情| 成人免费网站在线观看| 成人激情视频在线播放| 亚洲国产精品999| 亚洲欧美另类人妖| 国产欧美日韩高清| 在线视频免费一区二区| 日本人成精品视频在线| 在线视频精品一| 亚洲人成绝费网站色www| 国产精品久久久久久久久久尿| 88xx成人精品| 在线性视频日韩欧美| 欧美成年人视频| 欧美一区二区色| 亚洲最大的免费| 国产美女久久精品| 精品久久久久久中文字幕| 久久91精品国产| 在线观看亚洲区| 亚洲欧洲午夜一线一品| 精品电影在线观看| 国产日韩欧美在线播放| 欧美另类极品videosbestfree| 国产丝袜一区二区三区| 欧美另类69精品久久久久9999| 国产做受高潮69| 欧美电影在线观看高清| 色一区av在线| 亚洲跨种族黑人xxx| 国产精品va在线播放| 久久综合免费视频影院| 日本成人在线视频网址| 国产日韩av在线| 久久久久久久久久久91| 日韩在线视频观看正片免费网站| 精品久久久久久亚洲国产300| 高清日韩电视剧大全免费播放在线观看| 成人写真视频福利网| 欧美精品在线观看| 欧美日韩国产综合新一区| 粉嫩av一区二区三区免费野| 欧美日韩国产一区二区三区| 成人激情视频小说免费下载| 国产偷国产偷亚洲清高网站| 国产成人综合精品在线| 在线观看亚洲视频| 国内揄拍国内精品| 国产精品18久久久久久首页狼| 久久久成人的性感天堂| 粗暴蹂躏中文一区二区三区| 亚洲福利在线看| 在线播放国产精品| 国产自产女人91一区在线观看| 欧美中文字幕在线视频| 在线电影中文日韩| 亚洲国产精品久久精品怡红院| 亚洲黄色免费三级| 亚洲成年网站在线观看| 热久久免费国产视频| 亚洲肉体裸体xxxx137|