我的模特
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);
}
});
});
答案 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({ ... });
});