我正在尝试批量删除骨干模型的集合,如此......
collection.each(function(model, i){
model.destroy();
});
我发现当每个循环包含model.destroy()时,它会在10次计数后停止。如果我再次运行它,它会停止5次.3 ... 2之后的次数然后1次
如果我用console.log(i)替换model.destroy(),循环将运行集合的长度。
这是Backbone中的故意限制,以防止您一次删除1000条记录或浏览器限制相对同时使用DELETE方法的数量吗?
答案 0 :(得分:5)
Is this an intentional limitation within Backbone to keep you from deleting 1000 records in one shot or a browser limitation on the number of relatively simultaneous DELETE methods?
没有
问题是你在每次迭代时都要修改集合。请考虑以下事项。
假设您从10个模型的集合开始:
// pretend this collection has 10 models [m0,m1,m2,m3,m4,m5,m6,m7,m8,m9]
collection.each(function(model,i) {
model.destroy();
});
在您的第一次迭代中,您的collection.length === 10
和collection.each
的参数将为m0
和0
。所以你打电话给m0.destroy()
,它住在索引0。
在第一次迭代结束时,您的collection
包含以下模型
[m1,m2,m3,m4,m5,m6,m7,m8,m9]
以下是问题的开始:
现在进行第二次迭代collection.length === 9
。 each
函数现在正在进行第二次迭代,并在索引为1时获取模型,这就是模型2所在的位置。因此,each
的参数是m2,1
。然后,您可以调用m2.destroy()
并从集合中删除它。
在第二次迭代结束时,您的集合包含以下内容:
[m1,m3,m4,m5,m6,m7,m8,m9]
第三次迭代,您的索引将为2,并且将调用m4.destroy()
。离开你:
[m1,m3,m5,m6,m7,m8,m9].
直到索引大于collection.length
然后停止才会发生这种情况。让您在收藏中留下不需要的模型。
以下内容对您有用:
while ( (model=collection.shift()) ) {
model.destroy()
}
答案 1 :(得分:1)
同意以前的答案,你不允许这样做。
很快,在这种情况下我会做什么:
collection.map(function (model) {
return model.id;
}).each(function (id) {
collection.get(id).destroy();
});
答案 2 :(得分:0)
您是否尝试使用Backbone.Collection.remove
从集合中删除模型?我想通过调用model.destroy()
你打破了集合处理的内部模型数组。
试试这样:
collection.each(function(model, i) {
collection.remove(model);
model.destroy();
});