Backbone model.destroy(): Требуется ли явное удаление из коллекции?
У меня есть простой вопрос. Я смотрю на функцию с двумя строками кода:
deleteTask: function() {
this.parent.collection.remove(this.model);
this.model.destroy();
}
Если я прокомментирую первую строку, которая должна удалить модель из своей коллекции, все, кажется, работает так, как предполагалось (например, модель автоматически удаляется). С сайта Backbone это соответствующее обозначение для функции "destroy" модели:
Запускает событие "уничтожить" на модели, которое будет пузыриться через любые коллекции, содержащие его.
Можно ли предположить, что удаление this.parent.collection.remove(this.model);
никак не повлияет на функциональность кода? Это то, что я думаю, но я хотел убедиться в этом.
Спасибо!
Ответы
Ответ 1
Если вы уничтожаете модель, она удаляется из любых коллекций, которые ее содержат. Вы можете видеть это в базовом источнике
//Internal method called every time a model in the set fires an event.
_onModelEvent: function(event, model, collection, options) {
...
if (event === 'destroy') this.remove(model, options);
Итак, да, я бы не подумал, что вам нужно будет удалить модель из вашей коллекции явно.
Но не верьте мне, проверьте сами:)
deleteTask: function() {
that = this;
this.model.destroy({
success: function() {
console.log(that.parent.collection);
}
});
}
Проверьте консоль, чтобы убедиться, что модель была удалена из коллекции.
Ответ 2
Решение состоит в том, чтобы переопределить функцию разрушения модели Backbone. Я сделал это на абстрактной модели с успехом и стратегией обратного вызова:
Параметр "data" соответствует исходному параметру "resp".
destroy: function(successCallback, errorCallback)
{
var options = { wait: true };
var model = this;
successCallback = successCallback || function() {};
errorCallback = errorCallback || function() {};
var destroy = function()
{
model.trigger('destroy', model, model.collection, options);
};
options.success = function(data)
{
if ('SUCCESS' === data.responseCode)
{
if (options.wait || model.isNew())
destroy();
successCallback(data);
if (!model.isNew())
model.trigger('sync', model, data, options);
}
else
{
errorCallback(data);
}
};
if (this.isNew())
{
options.success();
return false;
}
var xhr = this.sync('delete', this, options);
if (!options.wait)
destroy();
return xhr;
}