2012年2月12日 星期日

Backbone.js Model 04︰fetch

一.說明
model本身除了可以當作儲存資料的物件,透過Model本身提供的fetch與save method即可對Server做儲存與讀取,而要取得資料的server API路徑則是設定在model.url上

fetch與save都是透過jQuery或zepto的ajax來達成,所以在使用backboneJS之前一定要先導入jQuery(或zepto)與underscore

二.model.fetch()
當直接執行model.fetch()完成後,會由server端取得的json物件,所有的json物件屬性全部都會倒進model的atrribute內並觸發change event,這時如果有監聽attribute上的相關屬性,所設定的callback都會被觸發

server端 info.json

{
    "isLogin":true,
    "nowPlayList":"my",
    "nowPlayIndex":0 
}
client端
window.Item=Backbone.Model.extend()
window.item=new Item({id:5});
item.url="json_sample/Info.json";
item.fetch();
item.bind("change:isLogin",function(){
        console.log('chang isLogin')
})

當執行fetch()後會觸發change而跳出alert,且這時item這個model內已經有了來自server端的資料
alert(item.get(“isLogin”))//true

三.model.fetch({success,error})
如果fetch取得的結果需要做其他應用或要對fetch失敗做處裡,可以在fetch內設定success與error callback,所設定的success與error callback會接收到兩個參數response與jsonObj(jsonObj在api文件內是用model代表)

在success內接收到的兩個參數,jsonObj是取得資料的json物件,response則已經是個包了接收資料的model物件,也就是說response物件包了attributes屬性,並把server取得的資料都放到了attributes內


window.Item=Backbone.Model.extend({
    url:function(){
        return 'server/simple.json';
    },  
    myname:'OZClass'
});
window.item=new Item({});  
item.fetch({
    success:function(response,model){   
    }
})    

注意:
success內接收到的jsonObj是個json物件,所以可以用obj.prop方式(如jsonObj.nowPlayList)
來讀取json物件屬性,response則是一個model物件,則就需要靠response.get(“nowPlayList”)來取得),若這時候在success用jsonObj.get(“nowPlayList”)會出錯

四. parse
通常只需要使用Model內預設的parse method即可,在自訂Model class時並不需要再定義這method,平常在使用model時也不需要呼叫執行parse,當執行fetch取得資料後,model內部自動會把取得的結果先執行parse處裡過

如果有需要改變取得的內容再寫入model才需要寫parse method

在success中只能將response的結果做其他利用,如果希望改變response的結果,那就需要改寫
parse medthod
window.Item=Backbone.Model.extend({
    parse:function(response){
        response.name="["+response.name+"]";
        console.log(response.name)
        return response
    },
});



1 則留言:

Unknown 提到...

感謝 Ozzysun您分享的blog寫的很詳盡,但在實作時發現有些小小的奇怪地方。
後來找到第三點,model.fetch({success,error}) 裡實作的程式碼。
第九行success 狀態 function裡的參數(response, model)。參考文件後發現改為function(model, response)程式碼變正常了。
謝謝提供文章,小小的閱讀回饋。感謝!!