[轉] 前端中的MVC

MVC是一種設計模式,它將應用劃分為3個部分:數據(模型)、展現層(視圖)和用戶交互(控制器)。其中:

M - MODEL(模型)

V - VIEW(視圖)

C - CONTROLLER(控制器)

一個事件的發生是這樣的過程:
  1. 用戶和應用產生交互。
  2. 控制器的事件處理器被觸發。
  3. 控制器從模型中請求數據,并將其交給視圖。
  4. 視圖將數據呈現給用戶。
不用類庫或框架就可以實現這種MVC架構模式。關鍵是要將MVC的每部分按照職責進行劃分,將代碼清晰地分割為若干部分,并保持良好的解耦。這樣可以對每個部分進行獨立開發、測試和維護。

M-模型

? 模型用來存放應用的所有數據對象。比如,可能有一個User模型,用以存放用戶列表、他們的屬性及所有與模型有關的邏輯。模型不必知道視圖和控制器的邏輯。任何事件處理代碼、視圖模板,以及那些和模型無關的邏輯都應當隔離在模型之外。將模型的代碼和視圖的代碼混在一起,是違反MVC架構原則的。模型是最應該從應用中解耦出來的部分。
當控制器從服務器抓取數據或創建新的記錄時,它就將數據包裝成模型實例。也就是說,我們的數據是面向對象的,任何定義在這個數據模型上的函數或邏輯都可以直接被調用。

V-視圖

? 視圖層是呈現給用戶的,用戶與之產生交互。在JavaScript應用中,視圖大都是由HTML、CSS、JavaScript模板組成的。除了模板中簡單的條件語句之外,視圖不應當包含任何其他邏輯。將邏輯混入視圖之中是編程的大忌,這并不是說MVC不允許包含視覺呈現相關的邏輯,只要這部分邏輯沒有定義在視圖之內即可。我們將視覺呈現邏輯歸類為“視圖助手”(helper):和視圖相關的獨立的小工具函數。

C-控制器

? 控制器是模型和視圖之間的紐帶。控制器從視圖獲取事件和輸入,對它們(很可能包含模型)進行處理,并相應地更新視圖。當頁面加載時,控制器會給視圖添加事件監聽,比如監聽表單提交或按鈕點擊。然后,當用戶和你的應用產生交互時,控制器中的事件觸發器就開始工作了。

? 在網頁交互中,可以這樣理解:

1.用戶點擊了表格中的數據

2.觸發了點擊事件,數據變成可編輯的狀態(這個時候會出現一個文本框,但是里面還沒有數據)

3.第2步的點擊事件從存放數據的模型中把數據放到文本框中,形成一種數據由不可編輯到可編輯的一種效果

舉個例子:

<select id="drinkSelect"><option value="coffee">coffee</option><option value="milk">milk</option><option value="juice">juice</option>
</select>
<p id="theColorOfDrink"></p><script type="text/javascript">
document.getElementById("drinkSelect").onchange = function() {var color;var colorOfDrink = {"coffee":"brown","milk":"white","juice":"orange"};color = colorOfDrink[this.value];document.getElementById("theColorOfDrink").innerHTML = color;
}
</script>

上面程序會把選中的飲料的顏色顯示出來,如果用MVC,就是這個樣子:

<select id="drinkSelect"><option value="coffee">coffee</option><option value="milk">milk</option><option value="juice">juice</option>
</select>
<p id="theColorOfDrink"></p><script type="text/javascript">
//showDrinkColor is Controller
var showDrinkColor = {start:function(){this.view.start();},set:function(drinkName){this.model.setDrink(drinkName);}
};
//Model
showDrinkColor.model = {colorOfDrink:{"coffee":"brown","milk":"white","juice":"orange"},selectedDrink:null,setDrink:function(drinkName){this.selectedDrink = this.colorOfDrink[this.selectedDrink]?drinkName:null;this.onchange();},onchange:function(){showDrinkColor.view.update();},getDrinkColor:function(){return this.selectedDrink?this.colorOfDrink[this.selectedDrink]:"white";}
};
//View
showDrinkColor.view = {start:function(){document.getElementById("drinkSelect").onchange = this.onchange;},onchange:function(){showDrinkColor.set(document.getElementById("drinkSelect").value);},update:function(){document.getElementById("theColorOfDrink").innerHTML = showDrinkColor.model.getDrinkColor();}
};
showDrinkColor.start();
</script>

進行分層之后,各個層次的功能清晰:V層控制界面顯示,將界面與數據連接;M層存放數據,處理邏輯,C層用于連接M和V,但是,代碼變復雜了。的確,層次越多,需要做的工作也越多,這里需要處理各層的通信。所以,具體怎么設計,還是要分析場景,因地制宜。

轉載于:https://www.cnblogs.com/chris-oil/p/6146596.html

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/259988.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/259988.shtml
英文地址,請注明出處:http://en.pswp.cn/news/259988.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

ipoo3可以用鴻蒙,iqooneo3支持無線充電嗎_iqooneo3可以無線充電嗎

iqoo neo3在不高的價格上還保證了自己的品質&#xff0c;有很高的性能&#xff0c;很不錯的屏幕。那么這款手機可以支持無線充電嗎&#xff1f;小編為大家介紹關于iqoo neo3的充電方面。1.iqoo neo3可以支持無線充電嗎iQOO Neo3 配備了 44W 超級閃充&#xff0c;屬于小刀&#…

紅帽Linux故障定位技術詳解與實例(1)

紅帽Linux故障定位技術詳解與實例(1) 2011-09-28 14:26 圈兒 BEAREYES.COM 我要評論(0) 字號&#xff1a;T | T在線故障定位就是在故障發生時, 故障所處的操作系統環境仍然可以訪問&#xff0c;故障處理人員可通過console, ssh等方式登錄到操作系統上&#xff0c;在shell上執行…

u2020 華為_華為5G網管U2020常用MML命令(很實用)

激活小區ACT NRCELL:;ACT NRDUCELL:;去激活小區DEA NRCELL:;DEA NRDUCELL:;查詢小區靜態信息LST NRCELL:;LST NRDUCELL:;查詢小區動態信息DSP NRCELL:;DSP NRDUCELL:;修改幀偏置MOD GNODEBPARAM:FRAMEOFFSET70728;修改子幀配比、時隙結構MOD NRDUCELL:NRDUCELLID0,DUPLEXMODECE…

Struts2中過濾器,攔截器,監聽器他們之間有什么區別?

1、攔截器是基于java反射機制的&#xff0c;而過濾器是基于函數回調的。2、過濾器依賴與servlet容器&#xff0c;而攔截器不依賴與servlet容器。3、攔截器只能對Action請求起作用&#xff0c;而過濾器則可以對幾乎所有請求起作用。4、攔截器可以訪問Action上下文、值棧里的對象…

pdf在html中加載不出來,在網頁中打開顯示PDF

在這里呢&#xff0c;本站僅為大家講解在網頁中顯示PDF文件的簡單方法&#xff0c;注意&#xff0c;是簡單方法&#xff0c;同時&#xff0c;本站已驗證過如下的相關代碼&#xff0c;測試已通過。當然&#xff0c;有的朋友可能會問&#xff0c;是否能達到像百度文庫那樣在網頁中…

hikaril連接sql2000_hikari連接池解析(版本:HikariCP-2.5.1.jar)

maxLifetime參數maxLifetime參數必須小于數據庫的time_wait,默認是1800000&#xff0c;即30分鐘。如果設置為0&#xff0c;表示存活時間無限大。如果不等于0且小于30秒則會被重置回30分鐘。HikariConfig類中有該參數的校驗規則。HikariPool類中&#xff0c;當我們初始化連接池的…

app開發歷程————Android程序解析服務器端的JSON格式數據,顯示在界面上

上一篇文章寫的是服務器端利用Servlet 返回JSON字符串&#xff0c;本文主要是利用android客戶端訪問服務器端鏈接&#xff0c;解析JSON格式數據&#xff0c;放到相應的位置上。 首先&#xff0c;android程序的布局文件main.xml 1 <LinearLayout xmlns:android"http://s…

Android IOS WebRTC 音視頻開發總結(八十七)-- WebRTC中丟包重傳NACK實現分析

Android IOS WebRTC 音視頻開發總結&#xff08;八十七&#xff09;-- WebRTC中丟包重傳NACK實現分析 本文主要介紹WebRTC中丟包重傳NACK的實現&#xff0c;作者&#xff1a;weizhenwei &#xff0c;文章最早發表在編風網&#xff0c;微信ID&#xff1a;befoio 支持原創&#x…

如何去除TD之間的空隙

table{border-collapse:collapse;}轉載于:https://www.cnblogs.com/passer1991/archive/2013/02/27/2935967.html

android切換到上個頁面,Android 返回上一個界面刷新數據

有些界面需要返回上一個界面刷刷新數據,再此做個記錄.首先startActivityForResult進行Actvity進行跳轉,這是跳轉前的界面.// 通過 startActivityForResult() 啟動 ActivityBIntent intent new Intent(getActivity(), NoticeActivity.class);startActivityForResult(intent, 1)…

composer設置代理_composer 設置代理

Docker registry V2部署私有Docker Registry 搭建 Insecure Registry 修改Registry server上的Docker daemon的配置,為DOCKER_OPTS增加–insecure ...css中的position&colon;relative和absolute 屬性語法: position : static | absolute | fixed | relative 取值: static :…

為網格布局圖片打造的超炫 CSS 加載動畫

今天&#xff0c;我想與大家分享一些專門為網格布局的圖像制作的很酷的 CSS 加載動畫效果。您可以把這些效果用在你的作品集&#xff0c;博客或任何你想要的網頁中。設置很簡單。我們使用了下面這些工具庫來實現這個效果&#xff1a; Normalize.css 來替代傳統的 CSS 復位&…

HTML多選框滾動條,《HTM單選.doc

《HTM單選1. 下面標記中&#xff0c;( )在標記的位置添加一個回車符。【選擇一項】A. B. C. D. 2. 要實現以下功能&#xff1a;在網頁中插入一個圖片joke11.gif,使用者通過單擊該圖片&#xff0c;連接到joke11.htm上去。下面的HTML代碼&#xff0c;( )是正確的。【選擇一項】A…

python時間處理模塊有哪些_Python模塊之時間處理

time 模塊>>> import time>>> dir(time)[__doc__, __name__, __package__, accept2dyear, altzone, asctime, clock, ctime, daylight, gmtime, localtime, mktime, sleep, strftime,strptime, struct_time, time, timezone, tzname]包含的變量:timezone -- …

wel

歡迎來到mathant.com 這個網站是什么 這個網站是我搭建在阿里云vps上的個人網站。目前的用途是充當個人博客和云存儲&#xff0c;當然它的功能不止如此。我會在以后的日子里完善他&#xff0c;希望他能變得更好。目前我在主機上只搭建了這個個人博客和一個ftp服務器。這個網站采…

php 安裝rabbitmq擴展無報錯版

需要安裝rabbitmq-c&#xff0c;rabbitmq-c是一個用于C語言的&#xff0c;與AMQP server進行交互的client庫。下載了v0.5.2版本(https://github.com/alanxz/rabbitmq-c/releases/download/v0.5.2/rabbitmq-c-0.5.2.tar.gztar xvf rabbitmq-c-0.5.2.tarcd rabbitmq-c-0.5.2autor…

ImageMagick 打水印支持透明度設置

convert 35021021120924162418300.jpg DD.png -geometry 60002048 -compose dissolve -define compose:args50 -composite -quality 95 35021021120924162418300_res.jpg轉載于:https://www.cnblogs.com/mfryf/archive/2013/03/04/2943209.html

spring mvc使用html頁面,使用Spring MVC的純HTML頁面應用程序

在Spring MVC所有的請求經過FrontController - DispatcherServlet的有你需要告訴Spring allowe JSP和HTML都在你的情況例dispatcher-servlet.xml:xmlns:xsi"http://www.w3.org/2001/XMLSchema-instance"xmlns:p"http://www.springframework.org/schema/p"x…

python win+r時不成功_Win與R(不使用Anaconda的情況下)

配置R的路徑信息&#xff1a;Path&#xff1a;添加R.dll的路徑 如&#xff1a;E:\software\R\R-3.5.1\bin\x64R_HOME:R的安裝路徑 如&#xff1a;E:\software\R\R-3.5.1\binR_USER:R的使用路徑 如&#xff1a;E:\software\R\R-3.5.1\bin\x64pip install rpy2在win下安裝失敗&am…

Devexpress VCL Build v2014 vol 14.1.4 發布

雖然這次沒加什么新東西&#xff0c;但是及時更新支持xe7&#xff0c;還算可以。 Whats New in 14.1.4 (VCL Product Line) New Major Features in 14.1 Whats New in VCL Products 14.1 Feature Highlights To learn about feature highlights in this version, please refer …