diff options
| -rw-r--r-- | src/widgets.js | 15 | ||||
| -rw-r--r-- | test/widgetsSpec.js | 9 |
2 files changed, 18 insertions, 6 deletions
diff --git a/src/widgets.js b/src/widgets.js index 04353bd5..2d9f53f7 100644 --- a/src/widgets.js +++ b/src/widgets.js @@ -373,7 +373,7 @@ function optionsAccessor(scope, element) { function noopAccessor() { return { get: noop, set: noop }; } -var textWidget = inputWidget('keyup change', modelAccessor, valueAccessor, initWidgetValue()), +var textWidget = inputWidget('keyup change', modelAccessor, valueAccessor, initWidgetValue(), true), buttonWidget = inputWidget('click', noopAccessor, noopAccessor, noop), INPUT_TYPE = { 'text': textWidget, @@ -451,7 +451,7 @@ function radioInit(model, view, element) { expect(binding('checkboxCount')).toBe('1'); }); */ -function inputWidget(events, modelAccessor, viewAccessor, initFn) { +function inputWidget(events, modelAccessor, viewAccessor, initFn, dirtyChecking) { return function(element) { var scope = this, model = modelAccessor(scope, element), @@ -463,10 +463,13 @@ function inputWidget(events, modelAccessor, viewAccessor, initFn) { // Don't register a handler if we are a button (noopAccessor) and there is no action if (action || modelAccessor !== noopAccessor) { element.bind(events, function (){ - model.set(view.get()); - lastValue = model.get(); - scope.$tryEval(action, element); - scope.$root.$eval(); + var value = view.get(); + if (!dirtyChecking || value != lastValue) { + model.set(value); + lastValue = model.get(); + scope.$tryEval(action, element); + scope.$root.$eval(); + } }); } scope.$watch(model.get, function(value){ diff --git a/test/widgetsSpec.js b/test/widgetsSpec.js index bff2c4e3..d6cee491 100644 --- a/test/widgetsSpec.js +++ b/test/widgetsSpec.js @@ -42,6 +42,15 @@ describe("widget", function(){ expect(scope.$get('count')).toEqual(2); }); + it('should not trigger eval if value does not change', function(){ + compile('<input type="Text" name="name" value="Misko" ng:change="count = count + 1" ng:init="count=0"/>'); + expect(scope.name).toEqual("Misko"); + expect(scope.count).toEqual(0); + browserTrigger(element, 'keyup'); + expect(scope.name).toEqual("Misko"); + expect(scope.count).toEqual(0); + }); + it('should allow complex refernce binding', function(){ compile('<div ng:init="obj={abc:{}}">'+ '<input type="Text" name="obj[\'abc\'].name" value="Misko""/>'+ |
