From dae4b97c947cbf4cb5fcc53cc74d7a0ce7faf67f Mon Sep 17 00:00:00 2001 From: Igor Minar Date: Fri, 2 Sep 2011 22:59:59 -0700 Subject: [PATCH] fix(ng:options): ng:change should be called after the new val is set Closes #547 --- src/widgets.js | 2 +- test/widgetsSpec.js | 16 +++++++++++----- 2 files changed, 12 insertions(+), 6 deletions(-) diff --git a/src/widgets.js b/src/widgets.js index 4bd7654f686d..c4db0cf81b26 100644 --- a/src/widgets.js +++ b/src/widgets.js @@ -765,8 +765,8 @@ angularWidget('select', function(element){ } } if (isDefined(value) && model.get() !== value) { - onChange(scope); model.set(value); + onChange(scope); } scope.$tryEval(function(){ scope.$root.$eval(); diff --git a/test/widgetsSpec.js b/test/widgetsSpec.js index 2f0ab6a3f013..295b0297ae5e 100644 --- a/test/widgetsSpec.js +++ b/test/widgetsSpec.js @@ -882,22 +882,28 @@ describe("widget", function(){ createSelect({ name:'selected', 'ng:options':'value for value in values', - 'ng:change':'count = count + 1' + 'ng:change':'log = log + selected.name' }); scope.values = [{name:'A'}, {name:'B'}]; scope.selected = scope.values[0]; - scope.count = 0; + scope.log = ''; scope.$eval(); - expect(scope.count).toEqual(0); + expect(scope.log).toEqual(''); select.val('1'); browserTrigger(select, 'change'); - expect(scope.count).toEqual(1); + expect(scope.log).toEqual('B'); expect(scope.selected).toEqual(scope.values[1]); + // ignore change event when the model doesn't change browserTrigger(select, 'change'); - expect(scope.count).toEqual(1); + expect(scope.log).toEqual('B'); expect(scope.selected).toEqual(scope.values[1]); + + select.val('0'); + browserTrigger(select, 'change'); + expect(scope.log).toEqual('BA'); + expect(scope.selected).toEqual(scope.values[0]); }); it('should update model on change through expression', function(){