Backbone JS: как отключить синхронизацию для удаления?
Я имею дело с коллекцией комментариев с потоками, и когда я удаляю комментарий с дочерними элементами, я делаю model.destroy()
для этого комментария, а на стороне сервера все его ветки удаляются.
Я написал функцию, которая после удаления node из дерева, ищет всех сирот и удаляет их тоже. Поэтому, когда я нахожу сирот, я запускаю на них model.destroy()
, но поскольку они уже удалены на сервере, синхронизация возвращает ошибки.
Есть ли способ отключить синхронизацию для некоторых вызовов destroy()
?
Ответы
Ответ 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);
}
});