如果你的Server不支援,只允許使用POST與GET
以下是處理方式
Client端
一.開啟設定使用emulateHTTP與emulateJSON
當開啟emulateHTTP時,Backbone會將原本應該用PUT與DELETE Method與Server溝通,改成以POST Method來送資料,並另外多傳遞一個POST參數_method
1.執行model.save()
原本會以PUT HTTP Method與Server溝通
會變成以POST HTTP Method與Server溝通,
並自動加上一個_method='PUT'的參數送出
2.執行model.destroy()
原本會以DELETE HTTP Method與Server溝通
會變成以POST HTTP Method與Server溝通,
並自動加上一個_method='DELETE'的參數送出
3.開啟emulateJSON
會將要傳遞的model資料序列化後,以一個POST參數model傳遞給server
Backbone.emulateHTTP = true;
Backbone.emulateJSON = true;
二.model執行CRUD相關參數區別
1.model.sync 接收到method值為
"create","read","update","delete"
2.REST Server接收到的HTTP METHOD為"POST","GET","PUT","DELETE"
3.非REST Server接收到的$_POST['_method']為"POST","GET","PUT","DELETE"
三.改寫Model SYNC
所有與Server溝通的動作,都會去執行到Sync,當model或collection執行CRUD時,會先去檢查model或Collection內是否有定義sync,如果有就會執行內部的synce,若沒有就會去執行系統global的Backbone.sync
要連結Server的URL,系統會先去檢查Sync內的options.url是否有設定,如果有會採用這裡的url來與Server溝通,若沒有才會去檢查model或collection內的url設定值
所以要讓不同的執行動作連結不同的Server url,規則就必須是寫在sync內
以下是model 改寫sync對應CRUD提供不同的url sample
define(['_Backbone'], function(Backbone) {
return Backbone.Model.extend({
sync:function(method, model, options){
switch(method){
case "create":
options.url =API_Save;
break;
case "update":
options.url = API_Update+"/"+this.id;
break;
case "delete":
options.url = API_Delete+"/"+this.id;
break;
}
return Backbone.sync(method, model, options);
}
})
});
Server端(以PHP為例)
一.判斷Client端要執行的動作
$cmd=$_POST['_method'];
$id=$_GET['id']
switch($cmd){
case "PUT":
$this->_update($id);
break;
case "DELETE":
$this->_delete($id);
break;
case "GET":
$this->_read($id);
break;
case "POST":
$this->_create($id);
break;
}
二.取得model資料$model=$_POST['model'];
if(ini_get("magic_quotes_gpc")=="1"){
$model=stripslashes($model);
};
$obj = json_decode($model);
就可以用$obj.prop..形式來讀取傳進來的json相關屬性了