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