gpt4 book ai didi

backbone.js - 销毁 Backbone 集合中每个模型的最干净方法?

转载 作者:行者123 更新时间:2023-12-03 13:38:51 25 4
gpt4 key购买 nike

在第一次尝试时,我写了

this.collection.each(function(element){
element.destroy();
});

这不起作用,因为它类似于 ConcurrentModificationException在Java中,所有其他元素都被删除。

我尝试在模型上绑定(bind)“删除”事件以按照建议销毁自己 Destroying a Backbone Model in a Collection in one step? ,但是如果我对属于集合的模型调用destroy,这将触发2个删除请求。

我查看了下划线文档,但看不到 each()向后循环的变体,这将解决删除每个元素的问题。

作为销毁模型集合的最干净的方法,您会建议什么?

谢谢

最佳答案

我最近也遇到了这个问题。看起来你解决了它,但我认为更详细的解释可能对其他想知道为什么会发生这种情况的人有用。

那么到底发生了什么?

假设我们有一个模型(书籍)的集合(库)。

例如:

console.log(library.models); // [object, object, object, object]

现在,让我们使用您的初始方法浏览并删除所有书籍:
library.each(function(model) {
model.destroy();
});
each是一个下划线方法,它是 mixed into the Backbone collection .它使用对其模型的集合引用( library.models)作为这些各种下划线集合方法的默认参数。好的,当然。这听起来很合理。

现在,当模型调用 destroy , 它 triggers a "destroy" event on the collection以及,然后将 remove its reference to the model .内部 remove ,你会注意到这一点:
this.models.splice(index, 1);

如果您不熟悉 splice ,见 doc .如果你是,你可能会明白为什么这是有问题的。

只是为了证明:
var list = [1,2];
list.splice(0,1); // list is now [2]

这将导致 each循环跳过元素,因为它通过 models 对模型对象的引用正在动态修改!

现在,如果您使用的是 JavaScript < 1.6,那么您可能会遇到此错误:
Uncaught TypeError: Cannot call method 'destroy' of undefined

这是因为在 each 的下划线实现中, 如果原生 forEach不见了。如果您在迭代中删除元素,它会提示,因为它仍然尝试访问不存在的元素。

如果原生 forEach确实存在,那么它将被使用,并且您根本不会收到错误!

为什么?根据 doc :

If existing elements of the array are changed, or deleted, their value as passed to callback will be the value at the time forEach visits them; elements that are deleted are not visited.



那么解决方案是什么?

不要使用 collection.each如果您要从集合中删除模型。使用允许您处理包含模型引用的新数组的方法。一种方法是使用下划线 clone method .
_.each(_.clone(collection.models), function(model) {
model.destroy();
});

关于backbone.js - 销毁 Backbone 集合中每个模型的最干净方法?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10858935/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com