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