最初
- JavaScript 是一種強(qiáng)大的疙教、動態(tài)的面向?qū)ο缶幊陶Z言
- 這門語言被誤解的原因:早期的JavaScript 比較糟糕改橘,有許多bug 剂府; 其名字帶有java前綴佳励,讓人以為與java有關(guān)系跨新,但它們是兩種語言富腊。
增加結(jié)構(gòu)
- 應(yīng)該將應(yīng)用解耦成一系列相互平等且獨(dú)立的部分。
- MVC是一種久經(jīng)考驗(yàn)的搭建應(yīng)用的方式域帐,可以確保應(yīng)用的可維護(hù)性和可擴(kuò)展性赘被。MVC模式完全適用于JavaScript應(yīng)用
MVC
- MVC是一種設(shè)計模式,將應(yīng)用劃為三部分:數(shù)據(jù)(模型)肖揣、展現(xiàn)層(視圖)和用戶交互層(控制器)民假。
- 事件的發(fā)生過程:
1.用戶和應(yīng)用發(fā)生交互
2.控制器的事件處理器被觸發(fā)
3.控制器從模型中請求數(shù)據(jù),并將其交給視圖
4.視圖將數(shù)據(jù)呈現(xiàn)給用戶
例:在Holla中發(fā)送一個新的聊天信息的過程:
1.用戶提交一個新的聊天信息
2.控制器的事件處理器被觸發(fā)
3.控制器創(chuàng)建了一個新的聊天模型(Chat Model)記錄
4.控制器更新視圖
5.用戶在聊天窗口看到新的消息
MVC各部分具體詳解如下:
模型
- 模型用來存放應(yīng)用所有的數(shù)據(jù)對象许饿。模型只需包含數(shù)據(jù)及直接和這些數(shù)據(jù)相關(guān)的邏輯阳欲。
- 任何事件處理器代碼、視圖末班陋率,以及那些和模型無關(guān)的邏輯都應(yīng)該隔離在模型外
- 數(shù)據(jù)是面向?qū)ο蟮那蚧魏味x在這個數(shù)據(jù)模型上的函數(shù)或邏輯都可以直接被調(diào)用
例:
var user = User.find("foo");
user.destory();
destory()函數(shù)是存放在命名空間User的實(shí)例中,User存放了所有的記錄(這只是理想情況)瓦糟,因?yàn)槲覀兛刂屏巳肿兞康膫€數(shù)筒愚,更好的避免了潛在的沖突。這種代碼更加清晰菩浙,而且非常容易做繼承巢掺。
視圖
- 視圖層是呈現(xiàn)給用戶的,用戶與之產(chǎn)生交互劲蜻。在JavaScript應(yīng)用中陆淀,視圖大都由HTML、CSS和JavaScript模板組成先嬉。
- 除了模板中簡單的條件語句之外轧苫,視圖不應(yīng)當(dāng)包含任何邏輯
- 包含視覺呈現(xiàn)相關(guān)的邏輯部分沒有定義在視圖之內(nèi)即可。我們將視圖呈現(xiàn)邏輯歸類為“視圖助手(helper)”:和視圖有關(guān)的獨(dú)立的小型工具函數(shù)疫蔓。
例:
//helper.js
var helper = {};
helper.formatData = function(){/*...*/};
//template.html
<div>
${helper.foematDate(this.date)}
</div>
helper是一個命名空間含懊,可以防止沖突并保持代碼清晰身冬、可擴(kuò)展
控制器
- 控制器是模型和視圖之間的紐帶〔砬牵控制器從視圖獲得時間和輸入酥筝,對它們(很可能包含模型)進(jìn)行處理,并進(jìn)行相應(yīng)的更新視圖雏门。
- 當(dāng)頁面加載時嘿歌,控制器會給視圖添加事件監(jiān)聽,然后當(dāng)用戶和你的應(yīng)用產(chǎn)生交互時茁影,控制器中的時間觸發(fā)器就開始工作搅幅。
- 不用類庫和框架也能實(shí)現(xiàn)控制器,下面代碼就是使用簡單的jQuery代碼來實(shí)現(xiàn)的:
var Controller = {};
//使用匿名函數(shù)來封裝一個作用域
(Controller.users = function($){
var nameClick = function(){
/*...*/
};
//在頁面加載時綁定事件監(jiān)聽
$(function(){
$("#view.name").click(nameClick)
});
})(jQuery);