我对此事感到疯狂。我真的无法弄清楚这里有什么问题。
我有一组称为项目的模型,每个项目都有自己的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方法中。它有效,但我肯定想知道为什么绑定不能正常工作。
答案 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。但这确实是一种品味问题。