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

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

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

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

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

4b9b3361

Ответ 1

Так как весь метод destroy отправляет запрос DELETE и запускает destroy, просто запускать destroy точно, что вы ищете.

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

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

Ответ 2

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

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

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();
},

Ответ 3

Это позволяет вам уважать вызов 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();
       }
    }
});

Ответ 4

В этой же проблеме.

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

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

Ответ 5

На основе ответа fcarriedo просто переопределите метод destroy в объявлении модели:

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