this.each没有正确地遍历集合

this.each not iterating through collection correctly

本文关键字:遍历 集合 正确地 each this      更新时间:2023-09-26

我刚刚开始使用backbone.js,我正在添加一些基本方法来扩展集合,使我能够遍历集合并保存所有模型,以及遍历集合以销毁所有模型。我意识到批量更新不是RESTful的,但我只是更新到本地存储,所以我不认为进行多次更新会有问题。

在我的基本应用程序中,该集合有9个模型。当我调用collection.saveModels()时,它会正确地记录集合的长度,并正确地保存所有模型。

当我调用collection.deleteModels()时,它会正确地记录集合的长度,但会跳过每一秒的模型(即第2个、第4个、第6个、第8个)。每次按下delete键时,它将继续只删除奇数索引元素,最后一个要删除的项目是第8个原始项目。

我是否可能错误地使用了每个函数,尽管它在我保存时工作得很好?

_.extend(Backbone.Collection.prototype, Backbone.Events, {
saveModels  :   function() {
    console.log(this.length);
    this.each(function(model){
        console.log('saving model ' + model.get('name'));
        model.save();
    });
},
deleteModels    :   function() {
    console.log(this.length);
    this.each(function(model){
        console.log('deleting model ' + model.get('name'));
        model.destroy();
    });
}
});

它们被称为:mycollection.saveModels();mycollection.deleteModels();

我意识到我可以根据长度迭代集合,但我宁愿尽可能使用内置方法。

bradgonesurfing发布的代码实际上不起作用,因为clone方法没有返回下划线对象。正确的方法是使用_.chain方法,使每个方法都可以链接。

_.chain(App.articles.models).clone().each(function(model){
  console.log('deleting model ' + model.get('name'));
  model.destroy();
});

下面的代码对我来说效果很好:

  destroyAll: function (options) {
    while (this.models.length > 0) {
        this.models[0].destroy(options);
    }    
}

每次调用model.dedestroy()时,它都会从集合中删除自己。each迭代器不知道这一点。做如下操作。

_.chain(App.articles.models).clone().each(function(model){
  console.log('deleting model ' + model.get('name'));
  model.destroy();
});

Backbone可以访问undercore.js实用程序。首先克隆模型阵列,然后对其进行迭代,然后销毁每个模型。应该工作

这是我最终使用的kinakuta's注释的实现。

destroy_models  :   function() {
    for (var i = this.length - 1; i > -1; i -=1){
        this.getByCid('c'+i).destroy();
    }
}