From 3a779a44ac06cc0fdd5d6faae2a173e1218d1088 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 42e608dd2467..254331c00f61 100644 --- a/src/widgets.js +++ b/src/widgets.js @@ -762,8 +762,8 @@ angularWidget('select', function(element){ } } if (isDefined(value) && model.get() !== value) { - onChange(scope); model.set(value); + onChange(scope); } scope.$root.$apply(); } finally { diff --git a/test/widgetsSpec.js b/test/widgetsSpec.js index 235f54929180..422202010f95 100644 --- a/test/widgetsSpec.js +++ b/test/widgetsSpec.js @@ -900,22 +900,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.$digest(); - 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(){