diff options
| -rw-r--r-- | src/Angular.js | 3 | ||||
| -rw-r--r-- | src/widgets.js | 18 | ||||
| -rw-r--r-- | test/widgetsSpec.js | 24 | 
3 files changed, 39 insertions, 6 deletions
| diff --git a/src/Angular.js b/src/Angular.js index 2df6bbef..8675bc40 100644 --- a/src/Angular.js +++ b/src/Angular.js @@ -379,7 +379,8 @@ function toKeyValue(obj) {  function angularInit(config){    if (config.autobind) {      var scope = compile(window.document, null, {'$config':config}); -    scope.$browser.addCss('../css/angular.css'); +    // TODO default to the source of angular.js +    scope.$browser.addCss('css/angular.css');      scope.$init();    }  } diff --git a/src/widgets.js b/src/widgets.js index 24c85464..4eae735f 100644 --- a/src/widgets.js +++ b/src/widgets.js @@ -7,7 +7,7 @@ function modelAccessor(scope, element) {      },      set: function(value) {        if (value !== undefined) { -        scope.$tryEval(expr + '=' + toJson(value), element); +        return scope.$tryEval(expr + '=' + toJson(value), element);        }      }    }; @@ -37,7 +37,9 @@ function valueAccessor(scope, element) {        if (lastError)          elementError(element, NG_VALIDATION_ERROR, null);        try { -        return parse(element.val()); +        var value = parse(element.val()); +        validate(); +        return value;        } catch (e) {          lastError = e;          elementError(element, NG_VALIDATION_ERROR, e); @@ -163,13 +165,15 @@ function inputWidget(events, modelAccessor, viewAccessor, initFn) {      var scope = this,          model = modelAccessor(scope, element),          view = viewAccessor(scope, element), -        action = element.attr('ng-change') || ''; +        action = element.attr('ng-change') || '', +        lastValue;      initFn.call(scope, model, view, element);      this.$eval(element.attr('ng-init')||'');      // 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();          // if we have noop initFn than we are just a button, @@ -177,8 +181,12 @@ function inputWidget(events, modelAccessor, viewAccessor, initFn) {          return initFn != noop;        });      } -    view.set(model.get()); -    scope.$watch(model.get, view.set); +    view.set(lastValue = model.get()); +    scope.$watch(model.get, function(value){ +      if (lastValue !== value) { +        view.set(lastValue = value); +      } +    });    };  } diff --git a/test/widgetsSpec.js b/test/widgetsSpec.js index b365175d..9df024cb 100644 --- a/test/widgetsSpec.js +++ b/test/widgetsSpec.js @@ -90,6 +90,30 @@ describe("widget", function(){            expect(scope.$element.val()).toEqual('456');          }); +        it("should not clober text if model changes doe to itself", function(){ +          compile('<input type="text" name="list" ng-format="list" value="a"/>'); + +          scope.$element.val('a '); +          scope.$element.trigger('change'); +          expect(scope.$element.val()).toEqual('a '); +          expect(scope.list).toEqual(['a']); + +          scope.$element.val('a ,'); +          scope.$element.trigger('change'); +          expect(scope.$element.val()).toEqual('a ,'); +          expect(scope.list).toEqual(['a']); + +          scope.$element.val('a , '); +          scope.$element.trigger('change'); +          expect(scope.$element.val()).toEqual('a , '); +          expect(scope.list).toEqual(['a']); + +          scope.$element.val('a , b'); +          scope.$element.trigger('change'); +          expect(scope.$element.val()).toEqual('a , b'); +          expect(scope.list).toEqual(['a', 'b']); +        }); +          it("should come up blank when no value specifiend", function(){            compile('<input type="text" name="age" ng-format="number"/>');            scope.$eval(); | 
