2012年2月8日 星期三

Backbone.js Model 02︰Class基本屬性

所有的Model都必須繼承自Backbone.Model,在自訂Model Class時可以自訂屬於自己的Class屬性,不過在Backbone.Model上已經內建以下幾項屬性

1.id:
預設這項會是空的,當這個id值是空的時候,如果要把model資料save到Server上會當作是一筆新的資料處理(也就是create),若id值非空值,當執行save存到Server時會被當作是update。 通常在一開始對server取得資料(fetch)存到model上時,Server傳回的資料也會包含id值
當使用者若在attribute內設定了id,則這個id同時也會設定到model.id上,例如你設定了id,所以id不僅在model下有,在model.attributes下也會有一份

2.cid:
當model的instance產生時,每個model自動就會產生一個cid值,這樣即使在model沒有id的狀況下還是可以取得透過cid找到這個model


3.attributes:
跟Server取得的資料,也就是真正在程式內所要用到資料,都會儲存在attributes內。
model可以被監聽,指的是只有在attributes下的相關值發生變化,才可以被監聽,

model.on("change:prop",callback);
這prop是在model.attributes下,而非在model下


4.initialize:
如果有設定這項,這function會在產生Model的instance時被執行。在initialize內要設定attributes屬性值可利用this.set({xxx:xxx})來做,也已可取用model的其他屬性

initialize:function(){

    this.set({url:"hi”})

    console.log(this.cid)

},    

5.url:
model要跟server要資料(fetch)或是要存資料到server(save),都會透過這url設定的位置去執行,也就是說這就是設定Server API的位置。如果這個model是在Collection內,那麼url的值通常都會由collection提供不需自己設定。url除了可以設定字串,也可設定為一function回傳,可以function做運算後,依照狀況傳回當時所需的server端網址

window.ItemClass=Backbone.Model.extend({
  url:"json_sample/playerInfo.json"
})
window.item=new ItemClass({id:5});


window.Item=Backbone.Model.extend()
window.item=new Item({id:5});
item.url="json_sample/playerInfo.json";

url可以是透過function取得

window.Item=Backbone.Model.extend({
  url:function(){
    return "json_sample/playerInfo.json?id="+this.get("id");
  }
});

6.urlRoot:
當model並不在Collection內,也未設定url時,會以urlRoot/id來當作該model的 url

window.Item=Backbone.Model.extend()
window.item=new Item({id:5,isLogin:false});
item.urlRoot="json_sample/playerInfo.json";
item.fetch();
這設定會讓fetch會去查詢"json_sample/playerInfo.json/5 這個路徑
如果不要這種形式,那就需自行以url function方式取得你自訂的url路徑

7.defaults:
defaults內所設定的是attributes屬性的預設值
若model在產生instance時未設定的屬性都會以defaults內值為預設

8.sync:
當執行save或destroy,會透過model預設的sync來呼叫
Backbone.sync,通常是不需要改寫這部份
如果需要先經過另外處理再去執行Backbone.sync
則需要定義這一塊
例如,若要讓save與fetch使用不同的網址就會需要用到這部份

9.parse:
當執行fetch由server取到資料存到attributes內時,會自動執行parse動作,把接收到的內容response。通常我們不需自己去定義parse,使用Backbone內建的即可,但如果由server取到的資料,要用自己的格式存到attributes內,可以自訂parse改寫存入attributes的形式。 parse會接收到一個response參數,這參數就server端回傳的array或物件

window.MyItem=Backbone.Model.extend({
  url:"json_sample/playerInfo.json",
  parse:function(response){
    response.nowPlayList="["+response.nowPlayList+"]";           
    return response;
  }
})

window.item=new MyItem();
item.fetch();

例 只取用server回應的部份值
window.MyItem=Backbone.Model.extend({
  url:"json_sample/playerInfo.json",
  parse:function(response){
    return response.foo;
  }
})
window.item=new MyItem();
item.fetch();

10.model屬性存取與model.attributes下的屬性的存取
如果是讀取model下的屬性可以直接用
 model.prop來取得(如myModelInstance.id)
如果是讀取model.attributies下的屬性則需要
透過get取的(如myModelInstance.get(“myname”))

如果是要寫入model下的屬性可以直接用
 myModelInstance.myprop=xxx設定
如果是要寫入model.attributes下的屬性
則用myModelInstance.set(“myprop”,xxx)

11. unset用來移除model屬性
model.unset('id')
移除物件屬性為
delete obj.xxx   

沒有留言: