我的一些Backbone模型应始终使用POST,而不是POST用于创建和PUT用于更新。我坚持使用这些模型的服务器能够支持所有其他动词,因此使用Backbone.emulateHTTP
也不是一个完美的解决方案。
目前,我会覆盖这些模型的isNew
方法并让它返回true
,但这并不理想。
除了直接修改backbone.js代码之外,还有一种简单的方法可以逐个模型地实现这个目标吗?我的一些模型可以使用PUT(它们被持久化到支持所有动词的不同服务器,包括PUT),因此将Backbone.sync替换为将'update'方法转换为'create'的服务器也不理想。
答案 0 :(得分:56)
对于需要直接强制对实例发出POST / PUT请求的任何人:
thing = new ModelThing({ id: 1 });
thing.save({}, { // options
type: 'post' // or put, whatever you need
})
答案 1 :(得分:15)
Short and Sweet将此放在Top
Backbone.emulateHTTP = true;
这将使用Get for Pull和Post for All推送(阅读创建,更新,删除)
答案 2 :(得分:8)
将同步(方法,型号,[选项])直接添加到您需要覆盖的模型中。
YourModel = Backbone.Model.extend({
sync: function(method, model, options) {
//perform the ajax call stuff
}
}
答案 3 :(得分:5)
我这样做的方法是覆盖sync()
因此
Models.Thing = Backbone.Model.extend({
initialize: function() {
this.url = "/api/thing/" + this.id;
},
sync: function(method, model, options) {
if (method === "read") method = "create"; // turns GET into POST
return Backbone.sync(method, model, options);
},
defaults: {
...
答案 4 :(得分:4)
我使用了Andres回答的修改,而不是havivng记得在我称之为{ type: 'post' }
的任何地方传递选项.save()
而只是将模型上的save
函数替换为让它始终添加该选项然后调用基本实现。感觉更干净......
module.exports = Backbone.Model.extend({
idAttribute: 'identifier',
urlRoot: config.publicEndpoint,
save: function (attributes, options) {
// because the 'identifier' field is filled in by the user, Backbone thinks this model is never new. This causes it to always 'put' instead of 'post' on save.
// overriding save here to always pass the option use post as the HTTP action.
options = _.extend(options || {}, { type: 'post' });
return Backbone.Model.prototype.save.call(this, attributes, options);
}
});