Подтвердить что ты не робот

Каков наименее уродливый способ заставить Backbone.sync обновления использовать POST вместо PUT?

Некоторые из моих моделей Backbone должны всегда использовать POST вместо POST для создания и PUT для обновления. Сервер, на котором я сохраняю эти модели, способен поддерживать все остальные глаголы, поэтому использование Backbone.emulateHTTP также не является идеальным решением.

В настоящее время я переопределяю метод isNew для этих моделей и возвращаю true, но это не идеально.

Помимо изменения непосредственно кода backbone.js, существует ли простой способ достижения этой цели на основе модели за моделью? Некоторые из моих моделей могут использовать PUT (они сохраняются на другом сервере, который поддерживает все глаголы, включая PUT), поэтому замена Backbone.sync на то, что преобразует метод "update" в "create", также не идеальна.

4b9b3361

Ответ 1

добавьте синхронизацию (метод, модель, [параметры]) непосредственно к вашим моделям, которые необходимо переопределить.

YourModel = Backbone.Model.extend({
  sync: function(method, model, options) {
    //perform the ajax call stuff
  }
}

Вот еще информация: http://documentcloud.github.com/backbone/#Sync

Ответ 2

Для тех, кому необходимо напрямую вызвать запрос POST/PUT:

thing = new ModelThing({ id: 1 });
thing.save({}, { // options
    type: 'post' // or put, whatever you need
})

Ответ 3

Коротко и ясно помещают это сверху

Backbone.emulateHTTP = true;

Это будет использовать Get for Pull и Post for All push (читать Create, Update, Delete)

Ответ 4

способ, которым я это сделал, состоит в том, чтобы переопределить 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: {
        ...

Ответ 5

Я использовал модификацию ответа Андреса и вместо того, чтобы 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);
  }
});