diff options
| -rw-r--r-- | angular-debug.js | 13 | ||||
| -rw-r--r-- | src/services.js | 2 | ||||
| -rw-r--r-- | src/validators.js | 2 | ||||
| -rw-r--r-- | src/widgets.js | 9 | ||||
| -rw-r--r-- | test/widgetsSpec.js | 15 |
5 files changed, 30 insertions, 11 deletions
diff --git a/angular-debug.js b/angular-debug.js index c3971b35..83ff265f 100644 --- a/angular-debug.js +++ b/angular-debug.js @@ -2839,7 +2839,7 @@ foreach({ element.removeClass('ng-input-indicator-wait'); scope.$invalidWidgets.markValid(element); } - element.data('$validate')(input); + element.data('$validate')(); scope.$root.$eval(); }); } else if (inputState.inFlight) { @@ -3202,6 +3202,11 @@ function valueAccessor(scope, element) { required = required || required === ''; if (!validator) throw "Validator named '" + validatorName + "' not found."; function validate(value) { + var force = false; + if (isUndefined(value)) { + value = element.val(); + force = true; + } if (element[0].disabled || isString(element.attr('readonly'))) { elementError(element, NG_VALIDATION_ERROR, null); invalidWidgets.markValid(element); @@ -3211,8 +3216,8 @@ function valueAccessor(scope, element) { validateScope = extend(new (extend(function(){}, {prototype:scope}))(), {$element:element}); error = required && !trim(value) ? "Required" : - validator({state:validateScope, scope:{get:validateScope.$get, set:validateScope.$set}}, value); - if (error !== lastError) { + (trim(value) ? validator({state:validateScope, scope:{get:validateScope.$get, set:validateScope.$set}}, value) : null); + if (error !== lastError || force) { elementError(element, NG_VALIDATION_ERROR, error); lastError = error; if (error) @@ -3621,14 +3626,12 @@ angularService('$route', function(location, params){ } }; function updateRoute(){ - console.log('updating route'); var childScope; $route.current = null; angular.foreach(routes, function(routeParams, route) { if (!childScope) { var pathParams = matcher(location.hashPath, route); if (pathParams) { - console.log('new route', routeParams.template, location.hashPath, location.hash); childScope = angular.scope(parentScope); $route.current = angular.extend({}, routeParams, { scope: childScope, diff --git a/src/services.js b/src/services.js index 1d3ba006..d98c0876 100644 --- a/src/services.js +++ b/src/services.js @@ -165,14 +165,12 @@ angularService('$route', function(location, params){ } }; function updateRoute(){ - console.log('updating route'); var childScope; $route.current = null; angular.foreach(routes, function(routeParams, route) { if (!childScope) { var pathParams = matcher(location.hashPath, route); if (pathParams) { - console.log('new route', routeParams.template, location.hashPath, location.hash); childScope = angular.scope(parentScope); $route.current = angular.extend({}, routeParams, { scope: childScope, diff --git a/src/validators.js b/src/validators.js index 27b4b404..81d40264 100644 --- a/src/validators.js +++ b/src/validators.js @@ -117,7 +117,7 @@ foreach({ element.removeClass('ng-input-indicator-wait'); scope.$invalidWidgets.markValid(element); } - element.data('$validate')(input); + element.data('$validate')(); scope.$root.$eval(); }); } else if (inputState.inFlight) { diff --git a/src/widgets.js b/src/widgets.js index 2909aed1..828e6d24 100644 --- a/src/widgets.js +++ b/src/widgets.js @@ -27,6 +27,11 @@ function valueAccessor(scope, element) { required = required || required === ''; if (!validator) throw "Validator named '" + validatorName + "' not found."; function validate(value) { + var force = false; + if (isUndefined(value)) { + value = element.val(); + force = true; + } if (element[0].disabled || isString(element.attr('readonly'))) { elementError(element, NG_VALIDATION_ERROR, null); invalidWidgets.markValid(element); @@ -36,8 +41,8 @@ function valueAccessor(scope, element) { validateScope = extend(new (extend(function(){}, {prototype:scope}))(), {$element:element}); error = required && !trim(value) ? "Required" : - validator({state:validateScope, scope:{get:validateScope.$get, set:validateScope.$set}}, value); - if (error !== lastError) { + (trim(value) ? validator({state:validateScope, scope:{get:validateScope.$get, set:validateScope.$set}}, value) : null); + if (error !== lastError || force) { elementError(element, NG_VALIDATION_ERROR, error); lastError = error; if (error) diff --git a/test/widgetsSpec.js b/test/widgetsSpec.js index ae6a17df..ecc00d05 100644 --- a/test/widgetsSpec.js +++ b/test/widgetsSpec.js @@ -60,7 +60,7 @@ describe("input widget", function(){ expect(scope.$element[0].checked).toEqual(false); }); - it("should process ng-validation", function(){ + it("should process ng-validate", function(){ compile('<input type="text" name="price" value="abc" ng-validate="number"/>'); expect(element.hasClass('ng-validation-error')).toBeTruthy(); expect(element.attr('ng-validation-error')).toEqual('Not a number'); @@ -76,6 +76,19 @@ describe("input widget", function(){ expect(element.attr('ng-validation-error')).toEqual('Not a number'); }); + it("should not call validator if undefinde/empty", function(){ + var lastValue = "NOT_CALLED"; + angularValidator.myValidator = function(value){lastValue = value;}; + compile('<input type="text" name="url" ng-validate="myValidator"/>'); + expect(lastValue).toEqual("NOT_CALLED"); + + scope.url = 'http://server'; + scope.$eval(); + expect(lastValue).toEqual("http://server"); + + delete angularValidator.myValidator; + }); + it("should ignore disabled widgets", function(){ compile('<input type="text" name="price" ng-required disabled/>'); expect(element.hasClass('ng-validation-error')).toBeFalsy(); |
