骨干模型#destroy通过Collection#每个都没有正确地遍历所有模型

时间:2016-06-03 23:05:38

标签: backbone.js model destroy

我的模特

app.Item = Backbone.Model.extend({
    defaults: {
        title: '',
        checked: false,
        price: 0
    }
});

集合

app.ItemCollection = Backbone.Collection.extend({
        model: app.Item,
        localStorage: new Store('itaaatems')
    });

我创建了一个简单的集合,其中包含模型'项目'。

app.itemCollection = new app.ItemCollection([
    new app.Item({title: "webb dev", checked: true, price: 100}),
    new app.Item({title: "drawing", price: 200}),
    new app.Item({title: "corn harvesting", price: 750}),
    new app.Item({title: "pen spinning", price: 50}),
    new app.Item({title: "pen spiddnning", price: 50}),
    new app.Item({title: "shark riding", price: 2000})
]);

我保存每一个并看到成功的回调。

app.itemCollection.each(function (item){

    item.save(null, {success: function () {
        console.log('good');
    }
});
});

当我将每个项目视为模型时,一切看起来都很好

app.itemCollection.each(function (item){
            console.log(item);
});

但是当我尝试删除它们并且由于某种原因删除第3项后,它会触及未定义的。由于某些原因,第4项未定义,而前3项我获得成功回调。

app.itemCollection.each(function (item){
    item.destroy({success: function (model, response) {
            console.log(response);
        }
    });
});

1 个答案:

答案 0 :(得分:3)

问题在于您是在迭代数组并同时修改它。您的app.itemCollection.each只不过是:

for(var i = 0; i < app.itemCollection.models.length; ++i)
    app.itemCollection.models[i].destroy({ ... });

伪装,每次destroy调用都会更改背后的app.itemCollection.models数组。如果您在删除内容时密切关注该集合:

app.itemCollection.each(function(item) {
    console.log(app.itemCollection.toJSON());
    item.destroy({ ... });
});

您应该看到迭代似乎跳过了项目。

您可以向后迭代并使用Collection#at和for循环:

for(i = app.itemCollection.length - 1; i >= 0; --i)
    app.itemCollection.at(i).destroy({ ... });

或使用toArray获取基础模型数组的副本并迭代它:

app.itemCollection.toArray().forEach(function(item) {
    item.destroy({ ... });
});