diff --git a/backbone-nested.js b/backbone-nested.js index 648f009..9b74a2d 100644 --- a/backbone-nested.js +++ b/backbone-nested.js @@ -176,10 +176,12 @@ var trigger = !opts.silent && (val.length >= i + 1), oldEl = val[i]; + // we should not change the original value + var aryVal = Backbone.NestedModel.deepClone(val); // remove the element from the array - val.splice(i, 1); + aryVal.splice(i, 1); opts.silent = true; // Triggers should only be fired in trigger section below - this.set(aryPath, val, opts); + this.set(aryPath, aryVal, opts); if (trigger){ attrStr = Backbone.NestedModel.createAttrStr(aryPath); diff --git a/test/nested-model.js b/test/nested-model.js index bc1a31a..3bda4d2 100644 --- a/test/nested-model.js +++ b/test/nested-model.js @@ -861,6 +861,21 @@ test("#changedAttributes() should clear the nested attributes between change eve doc.set({'name.last': 'Dylan'}, {validate: true}); }); +test("#changedAttributes() should clear the nested attributes between change events", function() { + doc.bind('change', function(){ + deepEqual(this.changedAttributes(), { + addresses: [ + { + city: 'Brooklyn', + state: 'NY' + } + ] + }); + }); + + doc.remove('addresses[1]'); +}); + // ----- CLEAR -------- test("#clear()", function() { @@ -1146,4 +1161,38 @@ test("issue #68 - _delayedTriggers is a singleton", function() { modelA.set("name.first", "s"); }); +test("issue #146 - Changing nested array variables does not set 'changedAttributes'", function() { + var model = new Klass({ + structure: { + abc: [ + { + items: [1, 2, 3], + groupId: 123 + }, + { + items: [4 ,5, 6], + groupId: 456 + } + ] + } + }); + model.bind('change', function () { + deepEqual(this.changedAttributes(), { + structure: { + abc: [ + { + items: [1, 2, 3], + groupId: 123 + }, + { + items: [4 ,5], + groupId: 456 + } + ] + } + }); + }); + + model.remove('structure.abc[1].items[2]'); +});