带有$ http.get

时间:2015-12-23 09:55:41

标签: angularjs http angularjs-directive get

问题是这个。如何将函数(响应)结果返回给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});
            };
        }
    }
}])

2 个答案:

答案 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}'