Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/backbone.js/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Backbone.js 以最干净的方式销毁主干中集合中的每个模型?_Backbone.js - Fatal编程技术网

Backbone.js 以最干净的方式销毁主干中集合中的每个模型?

Backbone.js 以最干净的方式销毁主干中集合中的每个模型?,backbone.js,Backbone.js,我第一次尝试写 this.collection.each(function(element){ element.destroy(); }); 这不起作用,因为它类似于Java中的ConcurrentModificationException,其他元素都被删除 我尝试在模型上绑定“remove”事件以按照建议销毁自身,但如果我对属于集合的模型调用destroy,则会触发2个delete请求 我查看了下划线文档,没有看到向后循环的each()变量,这将解决删除每个元素的问题 你认为销毁一系

我第一次尝试写

this.collection.each(function(element){
    element.destroy();
});
这不起作用,因为它类似于Java中的
ConcurrentModificationException
,其他元素都被删除

我尝试在模型上绑定“remove”事件以按照建议销毁自身,但如果我对属于集合的模型调用destroy,则会触发2个delete请求

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

你认为销毁一系列模型最干净的方法是什么


谢谢

这行得通,有点惊讶我不能用下划线来表示

for (var i = this.collection.length - 1; i >= 0; i--)
    this.collection.at(i).destroy();
this.collection.slice().forEach(element => element.destroy());

你也可以在适当的地方使用一种好的老式流行音乐:

var model;

while (model = this.collection.first()) {
  model.destroy();
}

我来晚了一点,但我认为这也是一个非常简洁的解决方案:

_.invoke(this.collection.toArray(), 'destroy');

依靠肖恩·安德森的回答。 可以直接访问主干收集阵列,所以您可以这样做

_.invoke(this.collection.models, 'destroy');
或者只需在没有参数的集合上调用
reset()
,该集合中的模型上的
destroy
metod将被双触发

this.collection.reset(); 

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

到底发生了什么? 假设我们有一个模型(书)的集合(图书馆)

例如:

console.log(library.models); // [object, object, object, object]
现在,让我们使用您最初的方法浏览并删除所有书籍:

library.each(function(model) {
  model.destroy();
});
每个
都是一个下划线方法。它使用对其模型(
library.models
)的集合引用作为这些不同下划线集合方法的默认参数。好的,当然。听起来很合理

现在,当模型调用
destroy
时,它也会这样做,然后它会。在
删除
中,您会注意到:

this.models.splice(index, 1);
如果您不熟悉
拼接
,请参阅。如果你是,你可能会明白为什么这是有问题的

只是为了证明:

var list = [1,2];
list.splice(0,1); // list is now [2]
这将导致
每个
循环跳过元素,因为它通过
模型
对模型对象的引用正在动态修改

现在,如果使用JavaScript<1.6,则可能会遇到以下错误:

Uncaught TypeError: Cannot call method 'destroy' of undefined
这是因为在
每个
的下划线实现中,如果缺少本机的
forEach
,它会返回到自己的实现。如果在迭代过程中删除某个元素,它会抱怨,因为它仍然试图访问不存在的元素

如果本机
forEach
确实存在,那么将使用它,您将不会得到任何错误

为什么??根据报告:

如果数组的现有元素被更改或删除,则传递给回调的值将是forEach访问它们时的值删除的元素不会被访问

那么解决办法是什么呢

不要使用集合。如果要从集合中删除模型,请使用每个集合。使用允许您处理包含模型引用的新数组的方法。一种方法是使用下划线


我更喜欢这种方法,尤其是如果您需要在每个模型上调用destroy,清除集合,而不是向服务器调用
DELETE
。删除
id
或设置为的任何
idAttribute
就是允许这样做的

var myCollection=new Backbone.Collection();
var models=myCollection.remove(myCollection.models);
_.每个(型号、功能(型号){
model.set('id',null);//破解以确保不向服务器发送删除
model.destroy();
});

对于此循环,不需要下划线和

for (var i = this.collection.length - 1; i >= 0; i--)
    this.collection.at(i).destroy();
this.collection.slice().forEach(element => element.destroy());

我尝试了这个,但它给了我一个“url”属性或函数必须被指定的
错误。将
pop()
更改为
first()
last()
修复了它。谢谢,@david——这是一个非常好的观点!如果从集合推断模型URL,则删除模型将触发此错误。我会修正答案。破坏主干模型将触发删除api调用-该调用抛出
必须指定“url”属性或函数的
错误。您需要首先
model.id=null
然后才能使用'model.destroy()'很好!我们甚至可以直接将其应用于集合:
this.collection.invoke('destroy')打电话到Array是很重要的。。。但一年后我不记得了(如果我们在执行过程中销毁元素,那么收集迭代很可能无法正常工作?无论哪种方式--
toArray
仍然是一个很好的、简洁的答案。如果它有效,让我们继续吧!:^)我想你是对的。Invoke可能会对元素进行迭代,如果您在没有创建副本的情况下销毁它,那么迭代将中断,但不是100%。这应该是正确的答案,thnx for the information非常感谢。这是我第一次尝试混搭BBJ,我决定一件一件地删除整个收藏。每次过关时,我都震惊地看到有少量物品被移除!这很好地解释了正在发生的事情,并消除了BBJ中的一些黑魔法。