Backbone JS: как отключить синхронизацию для удаления?

Я имею дело с коллекцией комментариев с потоками, и когда я удаляю комментарий, у которого есть дети, я делаю model.destroy() для этого комментария, а на стороне сервера все его ветви удаляются.

Я написал функцию, которая после удаления узла из дерева ищет всех сирот и удаляет их тоже. Поэтому, когда я нахожу сирот, я убегаю model.destroy() на них тоже, но поскольку они уже удалены на сервере, синхронизация возвращает ошибки.

есть ли способ отключить синхронизацию для некоторых destroy() звонки?

5 ответов


все destroy метод делает это отправить запрос на удаление и триггеры destroy, просто вызвав destroy is именно то, что вы искали.

model.trigger('destroy', model, model.collection, options);

Да, это кажется немного хакерским,но это почти все, что делает основной код. Если вы хотите, и если у вас есть базовая модель, из которой вы расширяетесь, вы можете добавить это в качестве метода к этой базовой модели, и это может не казаться таким хакерским.


это немного поздно, но может работать как альтернативное решение для других людей, имеющих ту же проблему.

столкнувшись с очень похожей проблемой, я в конечном итоге установил все идентификаторы детей в null перед вызовом destroy на них. Таким образом, костяк думает, что они новая и не порождает DELETE HTTP-запрос на сервер при удалении.

deleteParent: function() {
  this.model.children.each(function(child) {
    // Set to null so that it doesn't try to spawn a 'DELETE' http request 
    // on 'destroy' since thinks its new (hack).
    child.id = null; 
    child.destroy();
  });
  // This one DOES result in a 'DELETE' http request since it has an ID.
  this.model.destroy();
},

Это позволяет вам уважать вызов destroy, включая любые обработчики успеха

Backbone.Model.extend({
    destroy: function (options) {
       // don't make a server call, just delete from collection and call success
       this.trigger('destroy', this, this.collection, options);
       if (options && options.success) {
              options.success();
       }
    }
});

столкнулся с этой же проблемой.

использование ссылки модели на ее содержащую коллекцию для удаления модели из этой коллекции было моим предпочтительным решением, так как это было именно то, что я хотел сделать, и очень ясно в коде:

// From the view
this.model.collection.remove(this.model);

основываясь на ответе fcarriedo, просто переопределите метод destroy в объявлении вашей модели:

Models.YourModelName = Backbone.Model.extend({
    destroy: function () {
        this.id = null;
        Backbone.Model.prototype.destroy.apply(this, arguments);
    }
});