扩展 model.save
方法的最佳方法是什么?
我需要添加新方法将相同的数据发布到后端。即:played
方法应该(通过POST)请求apiurl/model/:id/played
e.g:
var Game = Backbone.Model.Extend({
baseUrl: '/games/',
played: function(){
this.url = this.baseUrl + this.id + '/played'
this.save();
}
});
var game = new Game({id:3234}); //is only an example, instances are created before previuosly
game.played();
这种方式有效,但请求是GET。此外,如果save()
没有发送请求中的所有属性,那将是完美的。
添加信息 由于我必须与跨域api进行交互,我已经扩展了sync方法以便使用JSONP。此外,我添加了一些安全说明。
//backbone sync
Backbone._sync = Backbone.sync;
Backbone.sync = function(method, model, options) {
//network
options.timeout = 10000;
options.dataType = "jsonp";
//security
if(_conf.general.accessToken){
var ak = _conf.general.accessToken,
url = model.url,
linker = url.indexOf('?') === -1 ? '?':'&';
model.url = url + linker + 'accessToken=' + ak+'&callback=';
}
//error manager
var originalError = options.error || function(){};
options.error = function(res){
originalError(res.status, $.parseJSON(res.responseText));
};
//call original Method
Backbone._sync(method, model, options);
};
答案 0 :(得分:5)
Backbone的save和fetch方法只调用Backbone.sync方法,而Backbone.sync方法只是ajax调用的包装器。您可以使用save函数传递ajax参数,而无需实际扩展它。基本上最终会是这样的:
game.save({attributes you want to save}, {type:'POST', url: 'apiurl/model/:id/played'});
每次都必须这样做,所以为您的模型扩展Backbone.sync可能是更好的做法。
Backbone网站提供了一些有关我正在谈论的内容的信息,以及Backbone同步和保存ajax选项。我还看到了一些关于扩展同步的例子,但我现在似乎无法追踪它们。