From 51ed6361f3567c9ab8fcbbff405a88e143933fa7 Mon Sep 17 00:00:00 2001 From: Michael Cox Date: Sat, 2 Jun 2012 16:30:02 -0400 Subject: [PATCH] Remove+Change events now fired when doing a remove() --- backbone-nested.js | 11 +++++++++-- test/nested-model.js | 38 ++++++++++++++++++++++++++++++++++++++ 2 files changed, 47 insertions(+), 2 deletions(-) diff --git a/backbone-nested.js b/backbone-nested.js index 7012c3a..274d370 100644 --- a/backbone-nested.js +++ b/backbone-nested.js @@ -98,7 +98,14 @@ this.set(aryPath, val, opts); if (trigger){ - this.trigger('remove:' + Backbone.NestedModel.createAttrStr(aryPath), this, oldEl); + var attrStr = Backbone.NestedModel.createAttrStr(aryPath); + this.trigger('remove:' + attrStr, this, oldEl); + this.trigger('change:' + attrStr, this, oldEl); + for (var aryCount = aryPath.length - 1; aryCount >= 0; aryCount--) { + attrStr = Backbone.NestedModel.createAttrStr(_.first(aryPath, aryCount)); + this.trigger('change:' + attrStr, this, oldEl); + }; + this.trigger('change', this, oldEl); } return this; @@ -152,7 +159,7 @@ // Trigger Remove Event if array being set to null if (value === null){ - var parentPath = _.initial(attrPath).join('.'); + var parentPath = Backbone.NestedModel.createAttrStr(_.initial(attrPath)); model._delayedTrigger('remove:' + parentPath, model, val[attr]); } diff --git a/test/nested-model.js b/test/nested-model.js index 020bf2a..1c3abec 100644 --- a/test/nested-model.js +++ b/test/nested-model.js @@ -452,6 +452,44 @@ $(document).ready(function() { ok(callbacksFired[2], "'remove:addresses' should fire"); }); + test("change+remove when removing from array", function() { + var callbacksFired = [false, false, false]; + + doc.bind('change', function(){ callbacksFired[0] = true; }); + doc.bind('change:addresses', function(){ callbacksFired[1] = true; }); + doc.bind('remove:addresses', function(){ callbacksFired[2] = true; }); + + doc.remove('addresses[1]'); + + ok(callbacksFired[0], "'change' should fire"); + ok(callbacksFired[1], "'change:addresses' should fire"); + ok(callbacksFired[2], "'remove:addresses' should fire"); + }); + + test("change+remove when removing from deep array", function() { + var callbacksFired = [false, false, false, false, false]; + + doc.set('name.middle', { + initial: 'L', + full: 'Limburger', + fullAlternates: ['Danger', 'Funny', 'Responsible'] + }); + + doc.bind('change', function(){ callbacksFired[0] = true; }); + doc.bind('change:name', function(){ callbacksFired[1] = true; }); + doc.bind('change:name.middle', function(){ callbacksFired[2] = true; }); + doc.bind('change:name.middle.fullAlternates', function(){ callbacksFired[3] = true; }); + doc.bind('remove:name.middle.fullAlternates', function(){ callbacksFired[4] = true; }); + + doc.remove('name.middle.fullAlternates[1]'); + + ok(callbacksFired[0], "'change' should fire"); + ok(callbacksFired[1], "'change:name' should fire"); + ok(callbacksFired[2], "'change:name.middle' should fire"); + ok(callbacksFired[3], "'change:name.middle.fullAlternates' should fire"); + ok(callbacksFired[4], "'remove:name.middle.fullAlternates' should fire"); + }); + // ----- CHANGED_ATTRIBUTES --------