迫使Backbone.sync更新使用POST而不是PUT的最难看的方法是什么?

时间:2011-12-15 22:45:10

标签: javascript backbone.js

我的一些Backbone模型应始终使用POST,而不是POST用于创建和PUT用于更新。我坚持使用这些模型的服务器能够支持所有其他动词,因此使用Backbone.emulateHTTP也不是一个完美的解决方案。

目前,我会覆盖这些模型的isNew方法并让它返回true,但这并不理想。

除了直接修改backbone.js代码之外,还有一种简单的方法可以逐个模型地实现这个目标吗?我的一些模型可以使用PUT(它们被持久化到支持所有动词的不同服务器,包括PUT),因此将Backbone.sync替换为将'update'方法转换为'create'的服务器也不理想。

5 个答案:

答案 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
  }
}

以下是更多信息:http://documentcloud.github.com/backbone/#Sync

答案 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);
  }
});