this.each没有正确地迭代集合

时间:2011-06-20 06:51:05

标签: javascript arrays backbone.js local-storage

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

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

当我调用collection.deleteModels()时,它会正确记录集合的长度,但会跳过每秒模型(即第2,第4,第6,第8)。每次按下删除时,它继续只删除奇数索引元素,最后一个要删除的项目是第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();

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

4 个答案:

答案 0 :(得分:8)

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

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

答案 1 :(得分:5)

每次调用model.destroy()时,它都会从集合中删除。每个迭代器都不知道这个。做类似以下的事情。

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

Backbone可以访问underscore.js工具。首先克隆模型数组然后 迭代,然后销毁每个模型。应该工作

答案 2 :(得分:5)

以下代码对我很有用:

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

答案 3 :(得分:-1)

这是我最终使用的kinakuta's评论的实现。

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