aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--angular-debug.js13
-rw-r--r--src/services.js2
-rw-r--r--src/validators.js2
-rw-r--r--src/widgets.js9
-rw-r--r--test/widgetsSpec.js15
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();