什麼是Model
Backbone 的作者是這樣定義Model 的:
Model 是任何一個web 應用的核心,它包含了交互的數據以及大部分的邏輯。例如:轉化、驗證、屬性和訪問權限等。
那麼,我們首先來創建一個Model:
Person = Backbone.Model.extend({ initialize: function(){ alert("Welcome to Backbone!"); }});var person = new Person;上述代碼中,我們定義了一個名為Person 的Model,實例化後,得到person。任何時候當你實例化一個Model,都會自動觸發initialize() 方法(這個原則同樣適用於collection, view)。當然,定義一個Model 時,並非強制要求使用initialize() 方法,但是隨著你對Backbone 的使用,你會發現它不可或缺。
設置Model 屬性
現在我們想在創建Model 實例時傳遞一些參數用來設置Model 的屬性:
Person = Backbone.Model.extend({ initialize: function(){ alert("Welcome to Backbone!"); }});//在實例化Model 時直接設置var person = new Person({ name: "StephenLee", age: 22 });//我們也可以在Model 實例化後,通過set() 方法進行設置var person = new Person();person.set({ name: "StephenLee", age: 22});獲得Model 屬性
使用Model 的get() 方法,我們可以獲得屬性:
Person = Backbone.Model.extend({ initialize: function(){ alert("Welcome to Backbone!"); }});var person = new Person({ name: "StephenLee", age: 22});var age = person.get("age"); // 22var name = person.get("name"); // "StephenLee"設置Model 默認屬性
有時你希望Model 實例化時本身就包含一些默認的屬性值,這個可以通過定義Model 的defaults 屬性來實現:
Person = Backbone.Model.extend({ defaults: { name: "LebronJames", age: 30, }, initialize: function(){ alert("Welcome to Backbone!"); }});var person = new Person({ name: "StephenLee"});var age = person.get("age"); // 因為實例化時未指定age 值,則為默認值30var name = person.get("name"); //實例化製定了name 值,則為"StephenLee"使用Model 屬性
你可以在Model 中自定義方法來使用Model 內的屬性。 (所有自定義的方法默認為public)
Person = Backbone.Model.extend({ defaults: { name: "LebronJames", age: 30, hobby: "basketball" }, initialize: function(){ alert("Welcome to Backbone!"); }, like: function( hobbyName ){ this.set({ hobby: hobbyName }); },});var person = new Person({ name: "StephenLee", age: 22});person.like("coding");// 設置StephenLee's hobby 為codingvar hobby = person.get("hobby"); // "coding"監聽Model 屬性的改變
根據Backbone 的機制,我們可以給對Model 的任意屬性進行監聽,接下來,我們嘗試在initialize() 方法中綁定Model 一個的屬性進行監聽,以屬性name 為例:
Person = Backbone.Model.extend({ defaults: { name: "LebronJames", age: 30, }, initialize: function(){ alert("Welcome to Backbone!"); this.on("change:name", function(model){ var name = model.get("name"); // 'KobeBryant' alert("Changed my name to " + name ); }); }});var person = new Person();var age = person.set({name : "KobeBryant"});通過上述代碼,我們知道瞭如何對Model 的某個屬性進行監聽。假設我們需要對Model 所有的屬性進行監聽,則使用'this.on("change", function(model){}); 。
服務器與Model 的數據交互
前文中已提到Model 包含了交互的數據,所以它的作用之一便是承載服務器端傳來的數據,並與服務器端進行數據交互。現在我們假設服務器端有一個mysql 的表user,該表有三個字段id, name, email 。服務器端採用REST 風格與前端進行通信,使用URL:/user 來進行交互。我們的Model 定義為:
var UserModel = Backbone.Model.extend({ urlRoot: '/user', defaults: { name: '', email: '' }});創建一個Model
Backbone 中每個Model 都擁有一個屬性id,它與服務器端數據一一對應。如果我們希望在服務器端的mysql 表user 中新增一條記錄,我們只需要實例化一個Model,然後調用save() 方法即可。此時Model 實例的屬性id 為空,即說明這個Model 是新建的,因此Backbone 將會向指定的URL 發送一個POST 請求。
var UserModel = Backbone.Model.extend({ urlRoot: '/user', defaults: { name: '', email: '' }});var user = new Usermodel();//注意,我們並沒有在此定義id 屬性var userDetails = { name: 'StephenLee', email: '[email protected]'};//因為model 沒有id 屬性,所以此時使用save() 方法,Backbone 會向服務器端發送一個POST 請求,服務器端收到數據後,將其存儲,並返回包含id 的信息給Modeluser.save(userDetails, { success: function (user) { alert(user.toJSON()); }})此時,在服務器端mysql 的user 表裡多了一條name 為StephenLee,email 為[email protected] 的記錄。
取得一個Model
剛剛我們已經創建了一個Model,並將它存儲到了服務器端的數據庫中,假設創建Model 時,服務器端返回的id 屬性值為1,此時,我們通過id 的值就可以將已存儲的數據取回。當我們用id 屬性值初始化一個Model 實例時,通過fetch() 操作,Backbone 將會向指定的URL 發送一個GET 請求。
var user = new Usermodel({id: 1});//初始化時指定id 的值//利用fetch() 方法將會向user/1 請求數據,服務器端將會返回完整的user 記錄,包含name,email 等信息user.fetch({ success: function (user) { alert(user.toJSON()); }})更新一個Model
如果我們需要對已經存儲的user 記錄進行修改,利用已知的id 值,同樣使用save() 方法,但因為此時id 不為空,Backbone 將會向指定的URL 發送一個PUT 請求。
var user = new Usermodel({ id: 1, name: 'StephenLee', email: '[email protected]'});//實例化時指定id 值//因為指定了id 值,此時使用save() 方法,Backbone 將會向user/1 發送PUT 請求,將會對數據庫中id 為1的記錄的email 修改user.save({email: '[email protected]'}, { success: function (model) { alert(user.toJSON()); }});刪除一個Model
如果我們需要刪除數據庫中的記錄,利用已知的id 值,使用destroy() 方法即可。此時,Backbone 將會向指定的URL 發送一個DELETE 操作。
var user = new Usermodel({ id: 1, name: 'StephenLee', email: '[email protected]'});//實例化時指定id 值//因為指定了id 值,此時使用destroy() 方法,Backbone 將會向user/1 發送DELETE 請求,服務器端接收請求後,將會在數據庫中刪除id 為1的數據user.destroy({ success: function () { alert('Destroyed'); }});什麼是Collection
簡而言之,Backbone 中的Collection 就是Model 的一個有序集合,比如,它可能會在以下情況中用到:
Model: Student, Collection: ClassStudentsModel: Todo Item, Collection: Todo ListModel: Animal, Collection: Zoo
Collection 一般只使用同一類型的Model,但是Model 可以屬於不同類型的Collection,比如:
Model: Student, Collection: Gym ClassModel: Student, Collection: Art ClassModel: Student, Collection: English Class
創建一個Collection
//定義Model Songvar Song = Backbone.Model.extend({ defaults: { name: "Not specified", artist: "Not specified" }, initialize: function(){ console.log("Music is the answer"); }});//定義Collection Albumvar Album = Backbone.Collection.extend({ model: Song //指定Collection 內的Model 為Song});var song1 = new Song({ name: "How Bizarre", artist: "OMC" });var song2 = new Song({ name: "Sexual Healing", artist: "Marvin Gaye" });var song3 = new Song({ name: "Talk It Over In Bed", artist: "OMC" });var myAlbum = new Album([ song1, song2, song3]);console.log( myAlbum.models ); // 輸出為[song1, song2, song3]