虽然你找到了答案我张贴使用测试用例异步验证的一个完整的例子。
angular.module('myModule').directive('nameValidator', function($http, $q) {
return {
restrict: 'A',
require: 'ngModel',
scope: {
edit: '=',
},
link: function(scope, element, attrs, ngModel) {
ngModel.$asyncValidators.uniqueCode = function() {
return $http.post('/checkFunc', {name: scope.edit}).then(
function(response) {
if (!response.data.validUsername) {
//invalid case ..validation failed
return $q.reject(response.data.errorMessage);
}
return true;
}
);
};
}
};
});
要使用此 -
<input type="text" ng-model="username" required name-validator>
其他方法不使用直接的范围。
.directive('usernameValidator', function($q, $timeout) {
return {
require: 'ngModel',
link: function(scope, element, attrs, ngModel) {
ngModel.$asyncValidators.username = function(modelValue, viewValue) {
if (!viewValue) {
return $q.when(true);
}
var deferred = $q.defer();
$timeout(function() {
// Faking actual server-side validity check with $http.
// Let's pretend our service is so popular all short username are already taken
if (viewValue && viewValue.length < 5) {
deferred.reject();
}
deferred.resolve();
}, 2000);
return deferred.promise;
};
}
};
});