国产精品电影_久久视频免费_欧美日韩国产激情_成年人视频免费在线播放_日本久久亚洲电影_久久都是精品_66av99_九色精品美女在线_蜜臀a∨国产成人精品_冲田杏梨av在线_欧美精品在线一区二区三区_麻豆mv在线看

JavaScript的MVC模式

開發(fā) 前端
我的目標(biāo)是編寫一個(gè)簡(jiǎn)單的 JavaScript 組件,來向大家展示一下 JavaScript 的強(qiáng)大。該組件是一個(gè)可編輯的項(xiàng)目列表(HTML中的 select 標(biāo)簽):用戶可以選擇某一項(xiàng)并刪除它,或者添加新的項(xiàng)目到列表中。

本文介紹了模型-視圖-控制器模式在 JavaScript 中的實(shí)現(xiàn)。

我喜歡 JavaScript,因?yàn)樗窃谑澜缟献铎`活的語言之一。在 JavaScript 中,程序員可以根據(jù)自己的口味選擇編程風(fēng)格:面向過程或面向?qū)ο蟆H绻闶且粋€(gè)重口味,JavaScript 一樣可以應(yīng)付自如:面向過程,面向?qū)ο螅?a target="_blank">面向方面,使用 JavaScript 開發(fā)人員甚至可以使用函數(shù)式編程技術(shù)

這篇文章中,我的目標(biāo)是編寫一個(gè)簡(jiǎn)單的 JavaScript 組件,來向大家展示一下 JavaScript 的強(qiáng)大。該組件是一個(gè)可編輯的項(xiàng)目列表(HTML中的 select 標(biāo)簽):用戶可以選擇某一項(xiàng)并刪除它,或者添加新的項(xiàng)目到列表中。組件將由三個(gè)類構(gòu)成,分別對(duì)應(yīng)著 MVC 設(shè)計(jì)模式的模型-視圖-控制器。

這篇文章只是一個(gè)簡(jiǎn)單的指導(dǎo)。如果你希望在實(shí)際的項(xiàng)目中使用它,你需要進(jìn)行適當(dāng)?shù)男薷摹N蚁嘈拍銚碛袆?chuàng)建和運(yùn)行 JavaScript 程序的一切:大腦,雙手,文本編輯器(如記事本),瀏覽器(例如我的*** Chrome)。

既然我們的代碼要使用 MVC 模式,因此我在這里簡(jiǎn)單介紹一個(gè)這個(gè)設(shè)計(jì)模式。 MVC 模式的英文名稱是 Model-View-Controller pattern,顧名思義,其主要部分組成:

模型Model(),用于存儲(chǔ)程序中使用到的數(shù)據(jù);

視圖(View),用不同的表現(xiàn)形式來呈現(xiàn)數(shù)據(jù);

控制器(Controller),更新模型。

在維基百科對(duì) MVC 體系結(jié)構(gòu)的定義中,它由如下三部分組成:

模型(Model) -“數(shù)據(jù)模型”(Model)用于封裝與應(yīng)用程序的業(yè)務(wù)邏輯相關(guān)的數(shù)據(jù)以及對(duì)數(shù)據(jù)的處理方法。 “模型”有對(duì)數(shù)據(jù)直接訪問的權(quán)力。 “模型”不依賴“視圖”和“控制器”,也就是說,模型不關(guān)心它會(huì)被如何顯示或是如何被操作。

視圖(View) - 視圖層能夠?qū)崿F(xiàn)數(shù)據(jù)有目的的顯示,通常是一個(gè)用戶界面元素。在視圖中一般沒有程序上的邏輯。在 Web 應(yīng)用程序中的 MVC,通常把顯示動(dòng)態(tài)數(shù)據(jù)的 html 頁面稱為視圖。

控制器(Controller) - 處理和響應(yīng)事件,通常是用戶操作,并監(jiān)控模型上的變化,然后去修改視圖。

The data of the component is a list of items, in which one particular item can be selected and deleted. So, the model of the component is very simple - it is stored in an array property and selected item property; and here it is:

我們將基于 MVC 實(shí)現(xiàn)一個(gè)數(shù)據(jù)列表組件,列表中的項(xiàng)目可以被選擇和刪除。因此,組件模型是非常簡(jiǎn)單的 - 它只需要兩個(gè)屬性:

數(shù)組 _items 用來存儲(chǔ)所有元素;普通變量 _selectedIndex 用來存儲(chǔ)選定的元素索引

代碼如下:

  1. /**  
  2.  * 模型。  
  3.  *  
  4.  * 模型存儲(chǔ)所有元素,并在狀態(tài)變更時(shí)通知觀察者(Observer)。  
  5.  */   
  6. function ListModel(items) {  
  7.     this._items = items;        // 所有元素  
  8.     this._selectedIndex = -1;   // 被選擇元素的索引  
  9.  
  10.     this.itemAdded = new Event(this);  
  11.     this.itemRemoved = new Event(this);  
  12.     this.selectedIndexChanged = new Event(this);  
  13. }  
  14.  
  15. ListModel.prototype = {  
  16.     getItems : function () {  
  17.         return [].concat(this._items);  
  18.     },  
  19.  
  20.     addItem : function (item) {  
  21.         this._items.push(item);  
  22.         this.itemAdded.notify({item : item});  
  23.     },  
  24.  
  25.     removeItemAt : function (index) {  
  26.         var item;  
  27.  
  28.         item = this._items[index];  
  29.         this._items.splice(index, 1);  
  30.         this.itemRemoved.notify({item : item});  
  31.  
  32.         if (index === this._selectedIndex) {  
  33.             this.setSelectedIndex(-1);  
  34.         }  
  35.     },  
  36.  
  37.     getSelectedIndex : function () {  
  38.         return this._selectedIndex;  
  39.     },  
  40.  
  41.     setSelectedIndex : function (index) {  
  42.         var previousIndex;  
  43.  
  44.         previousIndex = this._selectedIndex;  
  45.         this._selectedIndex = index;  
  46.         this.selectedIndexChanged.notify({previous : previousIndex});  
  47.     }  
  48. };  

Event 是一個(gè)簡(jiǎn)單的實(shí)現(xiàn)了觀察者模式(Observer pattern)的類:

  1. function Event(sender) {  
  2.     this._sender = sender;  
  3.     this._listeners = [];  
  4. }  
  5.  
  6. Event.prototype = {  
  7.     attach : function (listener) {  
  8.         this._listeners.push(listener);  
  9.     },  
  10.  
  11.     notify : function (args) {  
  12.         var index;  
  13.  
  14.         for (index = 0; index < this._listeners.length; index += 1) {  
  15.             this._listeners[index](this._sender, args);  
  16.         }  
  17.     }  
  18. };  

View 類需要定義控制器類,以便與它交互。雖然這個(gè)任務(wù)可以有許多不同的接口(interface),但我更喜歡最簡(jiǎn)單的。我希望我的項(xiàng)目是在一個(gè) ListBox 控件和它下面的兩個(gè)按鈕:“加號(hào)”按鈕添加項(xiàng)目,“減”刪除所選項(xiàng)目。組件所提供的“選擇”功能則需要 select 控件的原生功能的支持。

一個(gè) View 類被綁定在一個(gè) Controller 類上,其中「…控制器處理用戶輸入事件,通常是通過一個(gè)已注冊(cè)的回調(diào)函數(shù)」(wikipedia.org)。

下面是 View 和 Controller 類:

  1. /**  
  2.  * 視圖。  
  3.  *   
  4.  * 視圖顯示模型數(shù)據(jù),并觸發(fā) UI 事件。  
  5.  * 控制器用來處理這些用戶交互事件  
  6.  */   
  7. function ListView(model, elements) {  
  8.     this._model = model;  
  9.     this._elements = elements;  
  10.  
  11.     this.listModified = new Event(this);  
  12.     this.addButtonClicked = new Event(this);  
  13.     this.delButtonClicked = new Event(this);  
  14.  
  15.     var _this = this;  
  16.  
  17.     // 綁定模型監(jiān)聽器  
  18.     this._model.itemAdded.attach(function () {  
  19.         _this.rebuildList();  
  20.     });  
  21.  
  22.     this._model.itemRemoved.attach(function () {  
  23.         _this.rebuildList();  
  24.     });  
  25.  
  26.     // 將監(jiān)聽器綁定到 HTML 控件上  
  27.     this._elements.list.change(function (e) {  
  28.         _this.listModified.notify({ index : e.target.selectedIndex });  
  29.     });  
  30.  
  31.     this._elements.addButton.click(function () {  
  32.         _this.addButtonClicked.notify();  
  33.     });  
  34.  
  35.     this._elements.delButton.click(function () {  
  36.         _this.delButtonClicked.notify();  
  37.     });  
  38. }  
  39.  
  40. ListView.prototype = {  
  41.     show : function () {  
  42.         this.rebuildList();  
  43.     },  
  44.  
  45.     rebuildList : function () {  
  46.         var list, items, key;  
  47.  
  48.         list = this._elements.list;  
  49.         list.html('');  
  50.  
  51.         items = this._model.getItems();  
  52.         for (key in items) {  
  53.             if (items.hasOwnProperty(key)) {  
  54.                 list.append($('<option>' + items[key] + '</option>'));  
  55.             }  
  56.         }  
  57.  
  58.         this._model.setSelectedIndex(-1);  
  59.     }  
  60. };  
  61.  
  62. /**  
  63.  * 控制器。  
  64.  *  
  65.  * 控制器響應(yīng)用戶操作,調(diào)用模型上的變化函數(shù)。  
  66.  */   
  67. function ListController(model, view) {  
  68.     this._model = model;  
  69.     this._view = view;  
  70.  
  71.     var _this = this;  
  72.  
  73.     this._view.listModified.attach(function (sender, args) {  
  74.         _this.updateSelected(args.index);  
  75.     });  
  76.  
  77.     this._view.addButtonClicked.attach(function () {  
  78.         _this.addItem();  
  79.     });  
  80.  
  81.     this._view.delButtonClicked.attach(function () {  
  82.         _this.delItem();  
  83.     });  
  84. }  
  85.  
  86. ListController.prototype = {  
  87.     addItem : function () {  
  88.         var item = window.prompt('Add item:''');  
  89.         if (item) {  
  90.             this._model.addItem(item);  
  91.         }  
  92.     },  
  93.  
  94.     delItem : function () {  
  95.         var index;  
  96.  
  97.         index = this._model.getSelectedIndex();  
  98.         if (index !== -1) {  
  99.             this._model.removeItemAt(this._model.getSelectedIndex());  
  100.         }  
  101.     },  
  102.  
  103.     updateSelected : function (index) {  
  104.         this._model.setSelectedIndex(index);  
  105.     }  
  106. };  

當(dāng)然,Model, View, Controller 類應(yīng)當(dāng)被實(shí)例化。

下面是一個(gè)使用此 MVC 的完整代碼:

  1. $(function () {  
  2.     var model = new ListModel(['PHP''JavaScript']),  
  3.  
  4.     view = new ListView(model, {  
  5.         'list' : $('#list'),   
  6.         'addButton' : $('#plusBtn'),   
  7.         'delButton' : $('#minusBtn')  
  8.     }),  
  9.  
  10.     controller = new ListController(model, view);          
  11.     view.show();  
  12. });  
  13.  
  14. <select id="list" size="10" style="width: 15em"></select><br/>  
  15. <button id="plusBtn">  +  </button>  
  16. <button id="minusBtn">  -  </button>  

原文鏈接:http://justjavac.com/javascript/2012/12/14/model-view-controller-mvc-javascript.html

責(zé)任編輯:張偉 來源: justjavac
相關(guān)推薦

2017-11-23 17:21:31

Yii框架IntelYii框架深度剖析

2020-12-22 09:32:36

JavaScripMixin mixins

2023-10-30 10:20:45

2012-10-29 11:16:13

2011-06-02 18:02:50

iPhone MVC

2009-07-10 16:14:29

MVC設(shè)計(jì)模式Swing

2013-11-06 09:39:30

JavaScriptMVC框架

2009-02-12 09:55:22

AjaxMVCDojo

2011-04-22 09:26:57

MVC設(shè)計(jì)

2010-09-13 09:18:22

JavaScript模塊模式

2021-02-19 14:07:03

JavaScript編程開發(fā)

2012-12-25 09:38:41

JavaScript設(shè)計(jì)模式

2012-02-29 09:41:14

JavaScript

2015-09-08 13:39:10

JavaScript設(shè)計(jì)模式

2009-07-15 18:11:17

MVC模式學(xué)習(xí)

2009-07-30 13:45:40

ASP.NET開發(fā)模式MVC模式

2012-02-09 16:09:17

JavaScript

2012-05-09 10:09:18

JavaMEJava

2009-04-30 09:15:25

三層結(jié)構(gòu)MVC架構(gòu)

2015-02-09 10:43:00

JavaScript
點(diǎn)贊
收藏

51CTO技術(shù)棧公眾號(hào)

狠狠操一区二区三区| 欧美韩国日本在线观看| 亚洲午夜一区二区| 一区二区三区偷拍| 亚洲国产国产| 国产亚洲精品美女久久久久| 可以直接在线观看的av| 久久久精品日韩欧美| 日本在线免费观看一区| 日韩久久电影| 欧美激情久久久久久| 看黄在线观看| 在线一区二区三区| 天堂影视av| 国产精品乱人伦一区二区| 免费的av在线| 久久综合影音| 国产一级特黄a大片99| av伊人久久| 欧美亚洲日本网站| 6080成人| 久久成人一区二区| 日韩高清在线| 亚洲精选中文字幕| 超碰在线公开| 欧美成人免费网站| av免费在线免费| 91精品国产麻豆| 免费av在线| 91精品麻豆日日躁夜夜躁| 国产69久久| 欧美天天综合网| av在线首页| 欧美日韩一级二级三级| 成人福利在线| 91麻豆精品国产91久久久资源速度 | 亚洲午夜视频在线| av手机天堂| 成人欧美一区二区三区在线播放| 日本爱爱免费视频| 久久久一区二区三区捆绑**| 欧美一级欧美一级| 国产不卡视频一区二区三区| 国产免费裸体视频| 久久久噜噜噜久噜久久综合| 91av俱乐部| 亚洲欧洲日韩一区二区三区| 亚洲an天堂an在线观看| 亚洲六月丁香色婷婷综合久久| 国产午夜电影| 日韩欧美在线播放| 欧美成年黄网站色视频| 欧美精品一区二区三区蜜臀| 在线成人av观看| 久久综合伊人77777尤物| 麻豆国产精品| 国产91在线高潮白浆在线观看| 欧美成人自拍| 欧美成人综合一区| 国产在线精品不卡| 99视频免费播放| 一区二区三区欧美日| 成人影视在线播放| 亚洲国产成人精品久久| 台湾天天综合人成在线| 欧美中文字幕在线播放| 欧美久久影院| 中文字幕人成一区| 久久综合视频网| 中文在线www| 91精品国产91久久综合桃花| 日韩美女在线看免费观看| 欧美激情免费在线| 精品精品99| 翔田千里亚洲一二三区| 久久久青草青青国产亚洲免观| 黄页免费在线观看| 精品国产免费久久| 成人在线超碰| 精品一区二区三区视频日产| 国产黑丝在线一区二区三区| 超碰超碰在线观看| 欧美中文一区二区三区| 亚洲欧美在线成人| 91精品久久久久久久久青青| 奇米精品一区二区三区在线观看| 精品这里只有精品| 亚洲国产视频在线| 污视频网站免费在线观看| 久久99久久亚洲国产| 好看的亚洲午夜视频在线| 国产精品视频一二三四区| 午夜伦欧美伦电影理论片| 国产伦理精品| 国产乱人伦真实精品视频| 国产精品一卡二| 神马亚洲视频| xxx一区二区| 中文精品视频| 免费福利片在线观看| 亚洲国产成人久久综合| 精品国产精品| 成年人看的毛片| 欧美日韩一本到| 97久久亚洲| 综合国产精品久久久| 精品久久久久久久久久久| 欧美视频精品| 国精产品一区二区| 一区二区三区蜜桃网| 久久精品黄色| 欧美日韩一区二区三| 亚洲综合久久久久| 国产色99精品9i| 五月天久久综合网| 91久久精品网| 九九久久成人| 九色在线视频观看| 日韩免费看网站| 欧美成熟视频| 日日躁夜夜躁人人揉av五月天| 这里只有精品丝袜| 久久久精品网| 国产小视频在线| 国产精品v片在线观看不卡| 9人人澡人人爽人人精品| 日本资源在线| 精品综合久久久| 精品欧美国产一区二区三区| 你懂的在线观看一区二区| 五月丁香综合缴情六月小说| 欧美va亚洲va在线观看蝴蝶网| 91精品高清| 96久久久久久| 欧美在线视频免费播放| 国产午夜精品一区二区三区视频| 最新欧美色图| 天天爽天天狠久久久| 欧美日韩国产123区| 888久久久| 深夜福利免费在线观看| 国产精品久久久久7777婷婷| 日韩一区欧美一区| 精品欧美午夜寂寞影院| 免费涩涩18网站入口| 久久精品国产精品亚洲| 风间由美性色一区二区三区| 男人久久天堂| 国产专区在线视频| 一区二区三区视频免费在线观看| 国产精品99久久久久| 欧美日韩大片| 成人性免费视频| 久久久国产91| 久久精品一区蜜桃臀影院| 欧美私模裸体表演在线观看| 国产伦精品一区二区三区四区视频| 亚洲欧洲精品一区二区| 精品不卡在线| 亚洲一区二区三区视频在线 | 成人永久看片免费视频天堂| gogo高清在线播放免费| 久久久久久久久久久久久9999| 欧美视频在线免费| 欧美精品三区| 第三区美女视频在线| 成人h在线播放| 欧美性感一区二区三区| 亚洲三级毛片| 1区2区3区在线视频| 蜜桃视频在线观看91| 在线不卡a资源高清| 性伦欧美刺激片在线观看| 后进极品白嫩翘臀在线播放| 在线免费观看成人网| 一本久久综合亚洲鲁鲁| 久久影院电视剧免费观看| 亚洲一区电影| www免费在线观看视频| 超碰97在线资源| 日韩精品一区二区三区四区视频| 喷水一区二区三区| 唐人社导航福利精品| 亚洲精品高清无码视频| 国产精品久久久久久久久| 日本韩国欧美三级| 日本中文字幕一区二区视频 | 中文字幕乱码免费| xxxx欧美18另类的高清| 日本一区二区高清| 成人直播大秀| 欧美性猛片xxxxx免费中国| 欧美激情亚洲天堂| 51ⅴ精品国产91久久久久久| 欧美性极品xxxx做受| 美日韩一区二区三区| 中文幕av一区二区三区佐山爱| a视频免费看| 久久精品国产第一区二区三区最新章节 | 国产激情在线观看|