diff --git a/backbone.js b/backbone.js index 75917a81..8e0df5b1 100644 --- a/backbone.js +++ b/backbone.js @@ -600,6 +600,7 @@ this.models.splice(index, 0, model); model.bind('all', this._onModelEvent); this.length++; + options.index = index; if (!options.silent) model.trigger('add', model, this, options); return model; }, @@ -612,8 +613,10 @@ if (!model) return null; delete this._byId[model.id]; delete this._byCid[model.cid]; - this.models.splice(this.indexOf(model), 1); + var index = this.indexOf(model); + this.models.splice(index, 1); this.length--; + options.index = index; if (!options.silent) model.trigger('remove', model, this, options); this._removeReference(model); return model; diff --git a/test/collection.js b/test/collection.js index 1ff11fdf..80beeb98 100644 --- a/test/collection.js +++ b/test/collection.js @@ -122,6 +122,23 @@ $(document).ready(function() { equals(atCol.last(), h); }); + test("Collection: add model to collection and verify index updates", function() { + var f = new Backbone.Model({id: 20, label : 'f'}); + var g = new Backbone.Model({id: 21, label : 'g'}); + var h = new Backbone.Model({id: 22, label : 'h'}); + var col = new Backbone.Collection(); + + var counts = []; + + col.bind('add', function(model, collection, options) { + counts.push(options.index); + }); + col.add(f); + col.add(g); + col.add(h); + ok(_.isEqual(counts, [0,1,2])); + }); + test("Collection: add model to collection twice", function() { try { // no id, same cid @@ -173,6 +190,23 @@ $(document).ready(function() { equals(otherRemoved, null); }); + test("Collection: remove should return correct index events", function() { + var f = new Backbone.Model({id: 20, label : 'f'}); + var g = new Backbone.Model({id: 21, label : 'g'}); + var h = new Backbone.Model({id: 22, label : 'h'}); + var col = new Backbone.Collection([f,g,h]); + + var counts = []; + + col.bind('remove', function(model, collection, options) { + counts.push(options.index); + }); + col.remove(h); + col.remove(g); + col.remove(f); + ok(_.isEqual(counts, [2,1,0])); + }); + test("Collection: events are unbound on remove", function() { var counter = 0; var dj = new Backbone.Model();