2012年2月12日 星期日

Backbone.js Model 05︰Save

一.說明
使用model.fetch()會自Server讀取資料存到model上,使用model.save()則會是新增或更新資料到Server上,當在整個App操作時,model上的attributes資料有新增或更改時,呼叫model.save就會將資料上傳到server上,當model內沒有id值,系統會把save當作一個create的動作,新增一筆資料到Server,若是model內帶有id值,系統會當作是既有資料的更新update
二.Backbone.sync
Backbone.sync這個function在BackboneJS裡是真正執行與Server溝通的部份,但通常我們並不需要自己去定義sync function,也不需要自己去呼叫執行syn

當執行model.save()或是model.destroy()時會自動觸發執行Backbone.sync,而Backbone本身已經定義好sync function,預設是與RESTful的方式與Server做資料的傳送與接收,如果你要實做的新增刪除與修改的功能非RESTful,才需要自己改寫sync function
Backbone.sync=function(method,model,options){}
在sync被觸發時,sync會接收到3個參數
1.method:
當是在執行save method的值,會判斷如果model內無id值會當作是新增資料’create’,
若是有id值則method=’update’,當作是更新資料(或透過model.isNew判斷)
若是執行destroy則method=’delete’

2.model:
這代表執行save()的那個model物件(而非只是save時設定的改變值properties)
注意:這裡model是屬於model物件,必需要用model.get(‘prop’)來取值,若用model.prop就會出錯,model本身會帶有url,sync就會依更model內的url自動與server做溝通
3.options
接收到由model.save或model.destroy傳來的options設定,
[options]可以是success或error callback,這兩個callback同樣會接收到(model, response)參數

Backbone.sync=function(method,model,success,error){
    alert("method="+method+" model="+model.get("isLogin"));
};

三.model.save()
當執行save()後,Backbone.sync內接收到的model,會是整個model值都過去,即使用model.save([attributes]),Backbone.sync內接收到的model,還是整個model值都過去,而非只是save內所傳送的那幾項properties

model.save({isLogin:false})

四.model.save([attributes], [options]) 
1.[attributes]
先修改model內的attributies值,再進行save動作,
[attributes]是要改變的key-value
這樣的指令也就是同時包含以下兩個動作
model.set(attributes)
model.save()
2.[options] 要傳遞給sync用的選項
[options]可以是success或error callback,這兩個callback同要會接收到(model, response)
參數
例:
model.save(
    {isLogin:false},
    {error:function(model, response){..},
    {success:function(model, response){}
})

五.設定fetch與save使用不同url網址
model裡只有設定一個url值,fetch與save都會是使用同一個url去做處理,如果是使用REST,是可以用一個url就可以對應到CRUD的動作,但若非使用REST時,要讓不同的動作對應到不同的server端url處裡,可以有兩種方法
1.在執行fetch與save前,先傳入url網址再執行save與fetch

item.set({url:"save.php"})
item.save()    
2.改寫model內sync的function
先在model的sync內依照判斷把要傳遞的網址放到options內,再去改寫Backbone.sync,讓Backbone.sync依照接收到的options所帶的網址 做需要的處理

window.Item=Backbone.Model.extend({
    "sync":function(method, model, options){      
        switch(method){
        case "read":
            options.url = "json_sample/playerInfo.json";
            break;
        case "create":
            options.url = model.url + '/create';
            break;
        case "update":
            options.url = 'mytest/update.php';
            break;
        case "delete":
            options.url = model.url + '/delete';
            break;           
         }
    return Backbone.sync(method, model, options);
    }               
});

Backbone.sync=function(method,model,options){
    alert("from sync method="+method+" model="+JSON.stringify(model)+" url="+options.url);
};

注意:雖然fetch不會執行Backbone.sync,但還是可以在model.sync內得到url值
注意:當執行save要接收success event,如果不需要額外再帶參數,必須要在attribue的地方填上null
也就是model.save(null,{success:fun.....})

沒有留言: