我有一个简单的问题。我正在寻找一个包含2行代码的函数:
deleteTask: function() {
this.parent.collection.remove(this.model);
this.model.destroy();
}
如果我注释掉第一行,它应该从其集合中删除模型,那么事情似乎按预期工作(如同,模型会自动删除)。从Backbone的网站上,这是模型“破坏”功能的相关描述:
在模型上触发“销毁”事件,该事件将在包含它的任何集合中冒泡。
我可以安全地假设删除this.parent.collection.remove(this.model);
不会以任何方式影响代码的功能吗?这就是我的想法,但我想确保它。
谢谢!
答案 0 :(得分:34)
如果销毁模型,则会从包含模型的任何集合中删除它。您可以在backbone source
中看到//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);
}
});
}
自行检查控制台,看看模型是否已从集合中删除。
答案 1 :(得分:-3)
解决方案是覆盖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;
}