Backbone model.destroy():是否需要显式从集合中删除?

25

我有一个简单的问题。我正在看一个只有两行代码的函数:

deleteTask: function() {
    this.parent.collection.remove(this.model);
    this.model.destroy();
}
如果我注释掉第一行,即删除模型的集合,那么事情似乎会按预期工作(也就是说,模型将被自动删除)。从Backbone的网站上来看,这是关于模型“destroy”功能的相关描述:
“在模型上触发一个“destroy”事件,该事件将通过包含它的任何集合冒泡传递。”
我是否可以放心地假设删除this.parent.collection.remove(this.model);不会以任何方式影响代码的功能?这是我想的,但我想确认一下。
谢谢!
2个回答

36

如果您销毁一个模型,它将从包含它的任何集合中移除。您可以在backbone源代码中看到。

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

检查控制台,以查看模型是否已从集合中删除。


感谢您包含相关的源代码 - 这总是有助于我理解。 - cheshireoctopus

-3

解决方案是覆盖Backbone模型的destroy函数。我在一个抽象模型上成功地实现了这个回调策略:

参数"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;
}

解决什么问题?OP并没有说实际上存在问题。相反,他们是在问是否会出现问题。 - Stephen Eilert

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接