Вопрос вот в чем. Как я могу вернуть результат функции (ответа) в ngModel. $ AsyncValidators.usernameAvailable. URL-адрес, указанный в $ http.get, возвращает true, если пользователь существует, и false, если нет. P.S. 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});
            };
        }
    }
}])
1
MattJ 23 Дек 2015 в 12:55

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();
                });
            };
        }
    }
}])
2
dfsq 23 Дек 2015 в 10:05

Вам следует сбросить свойства формы. например

<form name="fred" novalidate> 
    ...     
</form>

<div>{{ fred }}</div>

Вы должны увидеть множество допустимых и недопустимых значений. Следует относиться к usernameAvailable. В вашем asyncValidator вам может потребоваться использовать $ q.resolve () и $ q.reject () для действительных и недействительных.

Обратите внимание, что вы можете полагаться на $ http (и не использовать $ q), поскольку $ http возвращает обещание, но это работает только в том случае, если вы хотите разрешить ответы 2xx и отклонить все остальные ответы, что, похоже, здесь не так.

Также при отклонении привязки произойдет сбой, если вы не используете ...

data-ng-model-options='{allowInvalid:true}'
0
danday74 23 Дек 2015 в 10:22