Backbone model.destroy()受限

And*_*son 0 javascript backbone.js

我试图批量删除骨干模型的集合,如此...

collection.each(function(model, i){
  model.destroy();
});
Run Code Online (Sandbox Code Playgroud)

我发现当每个循环包含model.destroy()时,它会在计数10后停止.如果我再次运行它,它会停止5.在3 ... 2 ..之后的时间然后是1.

如果我用console.log(i)替换model.destroy(),则循环运行集合的长度.

这是Backbone中的故意限制,以防止您在一次性删除1000条记录或浏览器限制相对同时DELETE方法的数量?

fby*_*ite 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();
});
Run Code Online (Sandbox Code Playgroud)

在你的第一次迭代中,你collection.length === 10和你的参数collection.each将是m00.所以你打电话,m0.destroy()它住在索引0.

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

[m1,m2,m3,m4,m5,m6,m7,m8,m9]
Run Code Online (Sandbox Code Playgroud)

以下是问题的开始:

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

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

[m1,m3,m4,m5,m6,m7,m8,m9]
Run Code Online (Sandbox Code Playgroud)

第三次迭代,你的索引将是2 m4.destroy()并将被调用.离开你:

 [m1,m3,m5,m6,m7,m8,m9].
Run Code Online (Sandbox Code Playgroud)

这种情况发生在索引大于collection.length然后停止之前.让您在收藏中留下不需要的模特.

以下内容对您有用:

while ( (model=collection.shift()) ) {
  model.destroy()
}
Run Code Online (Sandbox Code Playgroud)