【javascript激增的思考04】MVC與Backbone.js(beta)

來源:互聯網
上載者:User
前言

最近整理了很多前端面試題的東西,今天又去參加了一次面試,不知各位煩不煩,我反正有點累了,於是我們今天繼續回到我們前段時間研究的問題,我們再來看看MVC吧。

什麼是MVC

又回到這個問題了,到底什麼是MVC呢?

MVC是一種設計模式,他將應用劃分為:

① 資料(模型,model)

② 展現層(視圖,view)

③ 使用者互動(控制器,control)

一個事件發生的過程是這樣的:

① 使用者和應用產生互動② 控制器的事件處理器被觸發③ 控制器從模型中請求資料,並將其交給視圖④ 資料將資料呈現給使用者以一個聊天呈現為例:① 使用者提交一個新的聊天資訊② 控制器的事件處理器被觸發③ 控制器建立一個新的聊天模型記錄④ 控制器更新視圖⑤ 使用者看到聊天視窗新的資訊

以上的過程很簡單,但是有複雜的情況,於是我們會清晰的分割各個部分,這樣各個部分可以獨立開發,方便測試與維護,對解耦有好處。

模型

模型用以存放應用的所有資料對象,比如一個User模型,用以存放使用者列表、它們的屬性及所有與模型有關的邏輯。

模型不必知道視圖與控制器的細節,模型只需要包含資料以及直接和這些資料相關的邏輯。

任何事件處理代碼,視圖模板,以及那些和模型無關的邏輯都應該隔離刀模型以外。

模型與視圖代碼混到一起是違法MVC規則的。

當控制器從伺服器擷取資料時,他就將資料封裝成模型執行個體,來一個簡單的例子,不然我們都暈了:

1 var user = User.find('葉小釵');2 user.destroy();

怎麼樣夠簡單吧,先不要在意這個,後面點我們還會講到他。

視圖

視圖層是呈現給使用者的,使用者與之產生互動。

在js中,視圖大多是HTML+CSS+Javascript模板組成的,模板中除了簡單的條件陳述式外,不要有其它邏輯。

視圖不必知道模型和控制器幹了什麼,視圖中處理邏輯的代碼應該少一點

控制器

控制器是視圖與模型之間的紐帶,控制器由視圖擷取事件和輸入(事件來源於視圖),對他們進行處理,並更新視圖。

當頁面載入時,控制器會給視圖添加事件監聽,當使用者和應用發生互動時,控制器中的事件觸發程序就開始工作了。

var Controller = {};(Controller.users = function ($) {    var nameClick = function () {};    //在頁面上增加事件監聽    $(function () {        $('#view').click(nameClick);    })})(jQuery);

這坨莫名其妙的代碼,就是我們的控制器啦。

PS:現在各位覺得看著有點暈是很正常的,我研究了幾次了都還是有點暈呢,你們不孕的話我就要哭了

由於我們這裡不是要詳細的介紹MVC,所以就不多說了,後面點我們會有單獨的系列研究MVC這個東西,我們進入BackBone的學習吧。

什麼是Backbone

Backbone是構建javascript應用程式的一個優秀的類庫,他簡潔、輕量級但是他功能齊全,覆蓋了所有基礎功能,同時靈活性也很高。

該類庫提供了model、controller、view由此構成了我們構建應用程式的骨架。

backbone只有4k,只提供了模型、事件、集合、視圖、控制器和持久化等核心概念。

PS:backbone依賴於underscore.js

模型

模型是儲存應用程式資料的地方,我們可以把模型想象為對應用程式未經處理資料精心設計的抽象,並且添加了一些工具函數和事件。

1 var User = Backbone.Model.extend({2     initialize: function () { }3 });

extend第一個參數是一個對象,他成為了模型執行個體的屬性,第二個參數是可選的類屬性的雜湊,多次調用extend可以產生模型的子類,他們將繼承父親所有的類和執行個體的屬性。

1 var User = Backbone.Model.extend({2     //執行個體屬性3     instanceProperty: 'foo'4 }, {5     //類屬性6     classProperty: 'bar'7 });

當模型執行個體化時,他的initialize函數可接受任意執行個體參數,背後的工作原理是Backbone模型本身是建構函式,所以可以使用new產生一個新的執行個體:

1 var User = Backbone.Model.extend({2     initialize: function (name) {3         this.set({name, name});4     }5 });6 var user = new User('葉小釵');

PS:至於你們懂不懂,我反正是不懂了,所以繼續學習下去吧,囧.....

模型與屬性

使用set()和get()函數來設定和擷取執行個體裡的屬性:

user.set({name: '葉小釵'});

可以使用validate函數驗證一個屬性:

 1 var User = Backbone.Model.extend({ 2     validate: function (atts) { 3         if(!atts.email || atts.email.length < 3) { 4             return 'email error'; 5         } 6     } 7 }); 8 var user = new User(); 9 user.bind('error', function (model, error) {10 //錯誤處理11 });12 //這樣就會報錯13 user.set({email: 'ss'});
結語

這塊有點晦澀,我們今天暫時到這裡,我私下研究下再寫了。。。

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.