2016-06-03 27 views
1

Mein ModellBackbone Modell # zerstört durch Collection # jede Iteration nicht durch alle Modelle korrekt

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

Sammlung

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

ich eine einfache Sammlung erstellen, die das Modell 'Item' hat.

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}) 
]); 

Ich speichere jeden von ihnen und sehe den Erfolg Callback.

app.itemCollection.each(function (item){ 

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

Alles sieht gut aus, wie ich jedes Element als Modell sehen

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

Aber wenn ich versuche, sie zu löschen und aus irgendeinem Grund nach dem dritten Element zu löschen, trifft es einen nicht definiert. Der vierte Punkt ist aus irgendeinem Grund nicht definiert, während die ersten 3 ich Erfolg Rückrufe erhalten.

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

Antwort

3

Das Problem ist, dass Sie über ein Array iterieren und es gleichzeitig ändern. Ihr app.itemCollection.each ist kaum mehr als:

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

in der Verkleidung und jeder destroy Anruf wird die app.itemCollection.models Array hinter Ihrem Rücken ändern. Wenn Sie ein Auge auf die Sammlung behalten, wie Sie die Dinge sind zu löschen:

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

sollten Sie die Iteration sehen erscheinen, um Elemente zu überspringen.

Sie könnten rückwärts durchlaufen und Collection#at verwenden und eine for-Schleife:

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

oder toArray verwenden, um eine Kopie des zugrunde liegenden Array von Modellen und iterieren zu bekommen, dass:

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

Zustimmen, oder verwende 'while (app.itemCollection.length> 0) {app.itemCollection.at (0) .destroy(); } ' –