0

I'm attempting to bulk delete a collection of backbone models like so...

collection.each(function(model, i){
  model.destroy();
});

I'm finding that when the each loop contains model.destroy(), it stops after a count of 10. If I run it again, it stops a 5. The times after 3.. 2.. and then 1.

If I replace the model.destroy() with console.log(i), the loop runs the length of the collection.

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?

4

3 回答 3

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将是m0and 0。所以你打电话给它,m0.destroy()它位于索引 0 处。

在第一次迭代结束时,您collection包含以下模型

[m1,m2,m3,m4,m5,m6,m7,m8,m9]

以下是问题开始的地方:

现在进行第二次迭代,您的collection.length === 9. 该each函数现在正在进行第二次迭代,并在索引 1 处抓取模型,这就是模型 2 所在的位置。所以参数eachm2,1. 然后,您调用m2.destroy()并从集合中删除它。

在第二次迭代结束时,您的集合包含以下内容:

[m1,m3,m4,m5,m6,m7,m8,m9]

第三次迭代,您的索引将为 2m4.destroy()并将被调用。留给你:

 [m1,m3,m5,m6,m7,m8,m9].

这种情况会一直发生,直到索引大于collection.length然后停止。在您的收藏中留下不需要的模型。

以下内容应该适合您:

while ( (model=collection.shift()) ) {
  model.destroy()
}
于 2013-08-23T05:23:43.567 回答
1

同意以前的答案,您不允许这样做。

很快,在这种情况下我会做什么:

collection.map(function (model) {
  return model.id;
}).each(function (id) {
  collection.get(id).destroy();
});
于 2013-08-23T11:12:16.440 回答
0

您是否尝试过使用先从集合中删除模型Backbone.Collection.remove?我认为通过调用model.destroy()您正在破坏集合处理的模型的内部数组。

试试这样:

collection.each(function(model, i) {
    collection.remove(model);
    model.destroy();
});
于 2013-08-23T00:49:53.023 回答