diff --git a/src/deep-model.js b/src/deep-model.js index a38f2c1..00af145 100644 --- a/src/deep-model.js +++ b/src/deep-model.js @@ -237,12 +237,12 @@ // and update `this.changed` accordingly. If we're inside of a `change` // call, also add a trigger to the list. // - if (getNested(current, key) !== val) { + if (!_.isEqual(getNested(current, key), val)) { this.changed[key] = val; if (!loud) continue; - setNested(current, key, val); + setNested(current, key, (_.isArray(val) ? _.deepClone(val) : val)); var separator = DeepModel.keyPathSeparator; var fields = key.split(separator); diff --git a/test/deep-model.test.js b/test/deep-model.test.js index 1d67e76..d4b01d9 100644 --- a/test/deep-model.test.js +++ b/test/deep-model.test.js @@ -365,6 +365,77 @@ test("set: options are passed to the change:[attribute] callback", function() { })(); }); + +test("set: check events are triggered when using array notation", function() { + var model = create(); + + var triggeredEvents = []; + + model.bind('all', function(changedAttr, model, val) { + triggeredEvents.push(changedAttr); + }); + + model.set('list', new Array()); + deepEqual(triggeredEvents, [ + 'change:list', + 'change' + ]); + + triggeredEvents = []; + + model.set('list.0', {name: "John"}); + deepEqual(triggeredEvents, [ + 'change:list.0.name', + 'change:list.0.*', + 'change:list.*', + 'change' + ]); + + triggeredEvents = []; + + model.set('list.0.name', 'Bill'); + deepEqual(triggeredEvents, [ + 'change:list.0.name', + 'change:list.0.*', + 'change:list.*', + 'change' + ]); + + triggeredEvents = []; + + model.set('list.0.age', 21); + deepEqual(triggeredEvents, [ + 'change:list.0.age', + 'change:list.0.*', + 'change:list.*', + 'change' + ]); + + triggeredEvents = []; + + model.set('list.1', {name: 'Kate', age: 20}); + deepEqual(triggeredEvents, [ + 'change:list.1.name', + 'change:list.1.age', + 'change:list.1.*', + 'change:list.*', + 'change' + ]); + + triggeredEvents = []; + + deepEqual(model.get('list'), [ + { + name: 'Bill', + age: 21 + }, + { + name: 'Kate', + age: 20 + } + ]); +}); + test("has: Check if model has root key", function(){ var model = create(); @@ -791,4 +862,4 @@ test("defaults: with deep attributes", function() { equal(model.get('details.name.first'), 'John'); equal(model.get('details.name.last'), 'Smith'); equal(model.get('details.name.initial'), 'Z'); -}); +}); \ No newline at end of file