在Backbone模型中,我们有url和urlRoot属性:
url: function(){
return '/jobs'
},
urlRoot: function () {
return '/jobs'
},
但是我想在URL中添加params或查询参数,具体取决于GET,POST,PUT,DELETE等请求的类型。
所以我想做这样的事情:
url: function(type, opts){ //type and opts arguments are not available in Backbone, I just made them up for this example
var url = '/jobs';
switch (type) {
case 'GET':
break;
case 'POST':
break;
case 'PUT':
url = url + '?optimisticDelete=' + opts.optimisticDelete;
break;
case 'DELETE':
url = url + '?upsert=' + opts.upsert;
break;
default:
throw new Error('no match');
}
return url;
},
有没有一种很好的方法来完成这样的事情?
答案 0 :(得分:7)
默认情况下,Backbone模型和集合委托给Backbone.sync
函数与服务器进行交互。这是您可以访问HTTP方法的范围,如示例中所示。您可以覆盖模型或集合上的同步功能以自定义此行为。查看Backbone.sync
的{{3}}和documentation以及Backbone.sync
使用的source code。
我有一段时间没有触及Backbone或JavaScript,但我想它会看起来像这样(这基本上是伪代码,不要指望它按照书面形式工作):
sync: function (method, model, options) {
// method corresponds to the HTTP verb ("type" in your example)
switch (method) {
// ...build the correct url like in your example...
}
options = options || {};
options.url = url; // tack correct url onto options object
return Backbone.sync.apply(this, [method, model, options]);
}
这很可能需要更多的摆弄,但希望它能够解决问题。
答案 1 :(得分:3)
如果您在创建网址时指定forall a
,我认为您所拥有的就足够了。
type
下行是1.需要在需要url()时自己调用urlExtend(),2。你必须提供'类型'论证yourslf。
如果您不喜欢,可以覆盖Backbone.sync
urlExtended: function(type, opts) {
var url = this.url();
switch (type) {
case 'GET':
break;
case 'POST':
break;
case 'PUT':
url = url + '?optimisticDelete=' + opts.optimisticDelete;
break;
case 'DELETE':
url = url + '?upsert=' + opts.upsert;
break;
default:
throw new Error('no match');
}
return url;
}
您可以在加载Backbone以覆盖同步后放置上述代码。
答案 2 :(得分:2)
除了模型属性,如果您需要控制变量,那么我们也可以采用完全不同的方法并为请求添加适当的标头,这样我们就不必修改核心并投入时间进行测试。
var MyModel = new Backbone.Model();
if(MyModel.isNew()){ //create
MyModel.save(MyModel.attributes, { headers: { 'create': 'true' }});
}else{
MyModel.save({}, { headers: { 'upsert': 'true' }});
}
// GET&可以类似地处理DELETE
MyModel.fetch({ headers: { 'get': 'true' }});
MyModel.delete({ headers: { 'delete': 'true' }});
以上代码未经测试,但应该最常用。
参考文献:
http://backbonejs.org/#Model-save
http://backbonejs.org/#Model-isNew
How can I add a custom HTTP header to ajax request with js or jQuery?