Backbone Model没有正确调用destroy回调

时间:2011-10-14 15:06:45

标签: javascript backbone.js

我对此事感到疯狂。我真的无法弄清楚这里有什么问题。

我有一组称为项目的模型,每个项目都有自己的projectviewitem。

我正在尝试执行的任务就是删除属于该集合的所有模型。在此过程中也应删除相应的模型视图。 我是这样做的:

empty: function() {
    for(i=0; i<this.length; i++) {
        var model = this.at(i);
        console.log("script remove: "+model.get('id'));
        model.destroy();
    };

我确定我正在使用console.log输出来破坏正确的模型,这会给我每个模型ID。

在项目模型中,我有这个破坏功能:

destroy: function() {
    console.log(this);
    console.log("model remove: "+this.get('id'));
    return Backbone.Model.prototype.destroy.call(this);
    },

我再次确定我处理的是正确的模型。 我还检查模型的结构,以确保回调是正确的。

projectviewitem在模型的初始化方法中初始化:

initialize: function() {
    this.view = new ProjectViewItem({model: this});
},

它与模型绑定:

initialize: function() {
    this.model.bind('destroy', this.remove, this);
    ...

它的破坏方法是:

remove: function() {
    console.log("remove: "+this.model.get('id'));
    return Backbone.Model.prototype.remove.call(this);
},

现在关于console.log输出。

这是我清空集合时的结果。

script remove: 344
d (model 344 object)
model remove: 344
//here I should get "remove: 340", but I don't. That means the projectviewitem's remove method isn't called, but why?
script remove: 343
d (model 343 object)
model remove: 343
remove: 343
remove: 343
//model 343 makes two callback calls?

因此,所有模型都被删除但只有一个视图。我不明白模型344如何失去对其视图的回调以及模型343如何获得两个... 当我签出对象(&gt;&gt; d)时,回调是正常的。 344有自己的,对343来说是相同的,他们似乎指向了他们相应的观点。

有任何线索吗?

在我解决这个问题之前,我将(this.view.remove();)添加到model.destroy方法中。它有效,但我肯定想知道为什么绑定不能正常工作。

1 个答案:

答案 0 :(得分:3)

有一些事情可能会导致你的问题,但如果没有更多代码,很难确定:

  • 您不能使用递增for循环来删除项目(destroy()将从集合中删除项目),因为您正在改变长度。解决这个问题的经典方法是向后迭代,而不是向前迭代:

    empty: function() {
        for(i=this.length-1; i>=0; i--) {
            var model = this.at(i);
            console.log("script remove: "+model.cid);
            model.destroy();
        };
    }
    
  • 具有id的模型上的.destroy()方法不会触发destroy事件,除非服务器(relevant code)成功响应。所以你需要确保你的服务器响应了对DELETE请求的200响应。

  • 正如我的评论中所述,我不确定您是否通过在视图上调用Backbone.Model.prototype.destroy.call(this)来尝试做什么。我怀疑这是一个错字,无论是在你的帖子还是在你的代码中,但我不确定它会完成什么。

我希望至少其中一个问题是您问题的根源。我有一个工作jsFiddle,你的代码稍微修改一下:http://jsfiddle.net/e8Uct/3/ - 它只使用动态创建的模型,所以它不处理服务器回调。

顺便说一句,我个人不喜欢用模型初始化视图的模式 - 我宁愿反过来做,并保持模型完全独立于UI。但这确实是一种品味问题。