Angularjs $setValidity не блокирует отправку формы, если установлено значение false. Что здесь не так?

У меня есть директива "ensureUniqueValidator" для проверки уникальности значений в базе данных. Функция универсальная. Он вызывается на HTML-странице следующим образом:

<input type="email" name="email" ng-model="userCtrl.user.email" 
required ensure-unique-validator />

Код директивы:

    app.directive('ensureUniqueValidator', [
        '$http',
        function($http) {
            return {
                restrict : 'A',
                require : 'ngModel',
                link : function(scope, ele, attrs, c) {

                    c.$parsers.push(function(val) {

                        return $http.get(
                                'MainServlet.do?method=is' + attrs.name
                                        + 'unique&' + attrs.name + '='
                                        + val).then(
                                function(result) {
                                    console.log(result.data);
                                    c.$setValidity('ensureUniqueValidator',
                                            result.data);
                                    return result.data;//returns true or false
                                });
                    });
                }
            }
        } ]);

Проблема в том, что форма остается действительной, даже если сервер вернулся как False. Похоже, функция $setValidity не аннулирует форму.

Я делаю что-то не так здесь? Заранее спасибо.


comment
См. docs.angularjs.org/guide/forms#custom-validation. Вы должны использовать c.$asyncValidators, а не c.$parsers   -  person Phil    schedule 21.04.2015
comment
Спасибо за ссылку. Директива вызывается правильно, а также вызывается функция setValidity. Не могли бы вы указать, почему приведенный выше код не работает? Я пробовал asyncValidators, но результат был таким же. Я собираюсь попробовать использовать предоставленную вами ссылку, но если вы можете указать мне, что не так в приведенном выше коде, это было бы очень полезно для устранения моих сомнений. Спасибо еще раз.   -  person JVM    schedule 21.04.2015
comment
Взгляните на пример кода (script.js) по ссылке Пользовательские средства проверки выше. Директива username похожа на то, что вы хотите. Вам просто нужно вернуть обещание   -  person Phil    schedule 21.04.2015


Ответы (1)


Это должно работать (во всяком случае, согласно документам, я еще не написал ни одного из них).

Главное, кажется, что обещание должно либо разрешить допустимое значение, либо отклонить недопустимое.

// don't forget to inject the $q service
c.$asyncValidators.ensureUniqueValidator = function(modelValue, viewValue) {
    if (ctrl.$isEmpty(modelValue)) {
        // consider empty model valid
        return $q.when();
    }

    var params = {
        method: 'is' + attrs.name + 'unique'
    };
    params[attrs.name] = modelValue;

    return $http.get('MainServlet.do', {
        params: params
    }).then(function(response) {
        if (!response.data) {
            return $q.reject();
        }
        return true;
    });
};
person Phil    schedule 21.04.2015
comment
Привет, Фил, этот код сработал, я принимаю ответ. Спасибо!... Сначала я пытался проверить сервер на событии Blur. Я имею в виду, что форма должна оставаться недействительной до тех пор, пока значение не будет возвращено как уникальное == true с сервера. Это позволит избежать непрерывных вызовов на сервер, пока пользователь печатает в поле (в настоящее время происходит). Не могли бы вы помочь мне добиться того же? Спасибо! - person JVM; 24.04.2015
comment
@JVM Все еще работаю над приличной проверкой на стороне сервера при отправке. Я не поклонник стиля непрерывной проверки, который продвигает Angular. В этом посте есть несколько идей ~ stackoverflow.com /вопросы/12864887/ - person Phil; 24.04.2015
comment
Я использовал debounce для полей, которые мне нужно проверить на сервере, и это помогло. Это позволяет мне закончить печатать, а затем делает вызов сервера, работая аналогично событию размытия. ng-model-options={отменить отказ: 500} - person JVM; 27.04.2015