JavaScript模擬實現(xiàn)簡單的MVC的示例詳解
MVC
是一種常見的軟件架構(gòu)模式,將一個應(yīng)用程序分為三個核心的部分:模型(Model
)、視圖(View
)和控制器(Controller
)。MVC
模式的目的是將應(yīng)用程序的數(shù)據(jù)、用戶界面和控制邏輯分離,提高代碼的可維護性,可拓展性和可重用性。
在我們前端看來:
Model
模型層,用來獲取、存放所有的對象的數(shù)據(jù)View
表現(xiàn)層,呈現(xiàn)信息給用戶Controller
控制層,模型和視圖之間的紐帶。
下面我們就按照這三層劃分用js
實現(xiàn)一個MVC
。
場景
這里我們就來模擬一個場景。
點擊increase
按鈕,就增加,點擊decrease
就減少
<body> <div id="num"></div> <button id="increase">increase</button> <button id="decrease">decrease</button> </body> <script src="https://cdn.bootcdn.net/ajax/libs/jquery/3.6.4/jquery.js"></script> <script src="./index.js"></script>
為了方便操作dom
我們引入了jquery
。創(chuàng)建一個index.js
代碼邏輯放到index.js
中
核心思想
環(huán)境已經(jīng)準備好,下面給我開始搞!
在搞之前,我們首先要知道MVC
的核心思想是個啥?開頭的時候已經(jīng)講過了三個核心的部分,那如何讓這三個核心的部分串起來呢?
首先代碼運行起來要有一個初始化的過程。Controller
是模型和視圖之間的樞紐。首先需要對Controller
,并且需要在Controller
里面對Model
和View
之間建立關(guān)系。初始化的時候?qū)?code>Model中的數(shù)據(jù),渲染到View
中,同時View
層對界面中的行為事件進行監(jiān)聽,如果界面想要修改數(shù)據(jù)則觸發(fā)View
層中的監(jiān)聽行為,需要在Controller
中通知Model
層修改數(shù)據(jù),然后再展示到界面。
init
const myApp = {}; myApp.Model = function () {} myApp.View = function () {} myApp.Controller = function () {} (function () { var controller = new myApp.Controller(); controller.init(); })();
Controller
myApp.Controller = function () { var view, model; this.init = function () { model = new myApp.Model(); view = new myApp.View(this); model.register(view); model.notify(); }; this.increase = function () { model.add(1); model.notify(); }; this.decrease = function () { model.sub(1); model.notify(); }; };
當(dāng)執(zhí)行init
的時候,會對Model
和View
進行初始化,在初始化View
時,需要將Controller
本身傳入。為什么要傳入呢?下面看View
的時候會介紹。在model
中有個register
的方法,需要將初始化的view
注冊到model
中,同時需要觸發(fā)model
的notify
完成初始化的整個過程。
View
// View myApp.View = function (controller) { var $num = $("#num"), $inc = $("#increase"), $dec = $("#decrease"); this.render = function (model) { $num.text(model.getVal() + "rem"); }; $inc.click(controller.increase); $dec.click(controller.decrease); };
在view
中,獲取界面需要操作的dom
。定義一個render
方法,這個方法初始化的時候,會獲取model
中的數(shù)據(jù),渲染到界面上。當(dāng)數(shù)據(jù)發(fā)生變化的時候,render
方法會重新執(zhí)行,重新渲染。下面兩個按鈕監(jiān)聽了兩個事件,是controller
中increase
和decrease
方法。這就是為什么需要將controller
傳入到view
中。
Model
//Model myApp.Model = function () { var val = 0; this.add = function (v) { val += v; }; this.sub = function (v) { val -= v; }; this.getVal = function () { return val; }; var self = this, views = []; this.register = function (view) { views.push(view); }; this.notify = function () { for (var i = 0; i < views.length; i++) { views[i].render(self); } }; };
在Model
層中,定義了初始值val
,add
對值增加,sub
對值減少。getVal
對值的讀取。還定義了一個數(shù)組views
。還記得上面controller
的時候model.register(view)
嗎?初始化的時候,將view
存入到model
的views
中。notify
就是通知view
更新的。執(zhí)行notify
的時候,對views
中的每個view
遍歷,然后執(zhí)行view
的render
方法,這就是發(fā)布訂閱模式。
到此這篇關(guān)于JavaScript模擬實現(xiàn)簡單的MVC的示例詳解的文章就介紹到這了,更多相關(guān)JavaScript實現(xiàn)MVC內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
JavaScript之Map和Set_動力節(jié)點Java學(xué)院整理
這篇文章主要為大家詳細介紹了JavaScript之Map和Set的相關(guān)資料,具有一定的參考價值,感興趣的小伙伴們可以參考一下2017-06-06JS實現(xiàn)可自定義大小,可雙擊關(guān)閉的彈出層效果
這篇文章主要介紹了JS實現(xiàn)可自定義大小,可雙擊關(guān)閉的彈出層效果,涉及JavaScript定時函數(shù)及頁面元素動態(tài)操作的相關(guān)技巧,具有一定參考借鑒價值,需要的朋友可以參考下2015-10-10javascript操作table(insertRow,deleteRow,insertCell,deleteCell方
本篇文章主要介紹了javascript操作table(insertRow,deleteRow,insertCell,deleteCell方法)需要的朋友可以過來參考下,希望對大家有所幫助2013-12-12echarts餅圖標簽formatter使用及餅圖自定義標簽
項目中有遇到需要使用餅圖展示每種狀態(tài)所占比例,去echarts官網(wǎng)學(xué)習(xí)了一番,下面這篇文章主要給大家介紹了關(guān)于echarts餅圖標簽formatter使用及餅圖自定義標簽的相關(guān)資料,需要的朋友可以參考下2022-12-12layui radio點擊事件實現(xiàn)input顯示和隱藏的例子
今天小編就為大家分享一篇layui radio點擊事件實現(xiàn)input顯示和隱藏的例子,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧2019-09-09js數(shù)組轉(zhuǎn)json并在后臺對其解析具體實現(xiàn)
這篇文章主要介紹了js數(shù)組轉(zhuǎn)json并在后臺對其解析具體實現(xiàn),有需要的朋友可以參考一下2013-11-11