问题是这个。如何将函数(响应)结果返回给ngModel。$ asyncValidators.usernameAvailable。如果用户存在,$ http.get中指定的url返回true,否则返回false。附: response.data返回正确的答案,我查了一下。
app.directive('usernameAvailableValidator',['$http', function($http){
return{
restrict : 'A',
require : 'ngModel',
link : function(scope, element, attrs, ngModel){
ngModel.$asyncValidators.usernameAvailable = function(username){
return $http.get('/auth/username/exists/'+username).
then(function(response){return response.data});
};
}
}
}])
答案 0 :(得分:2)
异步验证程序期望在验证失败的情况下拒绝承诺。这意味着如果用户存在,您需要拒绝承诺。在你的情况下,只需使用$ q.reject:
app.directive('usernameAvailableValidator', ['$q', '$http', function($q, $http) {
return {
restrict: 'A',
require: 'ngModel',
link: function(scope, element, attrs, ngModel) {
ngModel.$asyncValidators.usernameAvailable = function(username) {
return $http.get('/auth/username/exists/' + username).
then(function(response) {
if (response.data) return $q.reject();
});
};
}
}
}])
答案 1 :(得分:0)
您应该转储表单属性。 e.g。
<form name="fred" novalidate>
...
</form>
<div>{{ fred }}</div>
您应该看到一堆有效和无效的值。一个应该与usernameAvailable相关。 在您的asyncValidator中,您可能需要使用$ q.resolve()和$ q.reject()来表示有效和无效。
请注意,您可以依赖$ http(而不是使用$ q),因为$ http会返回一个承诺,但这只适用于您想要解决2xx响应并拒绝所有其他响应,这似乎不是案例在这里。
除非您使用...
,否则拒绝绑定将失败data-ng-model-options='{allowInvalid:true}'