Foundation 6 Соблюдайте пользовательскую проверку с помощью ajax

Используя Foundation 6 Abide, я создал собственный валидатор, который должен проверять поле имени пользователя по шаблону и также обращаться к серверу, чтобы узнать, зарегистрировано ли уже имя пользователя. Когда пользовательский валидатор выполняется, он сначала проверяет имя пользователя по шаблону регулярных выражений - если это удается, он затем выполняет ajax-вызов на сервер, чтобы проверить, существует ли имя пользователя. Поскольку javascript не ждет, пользовательская функция проверки возвращает "true", указывая, что все в порядке. Когда ajax-вызов завершается, если имя пользователя найдено, он вызывает "addErrorClasses" в поле. Это прекрасно работает, однако я обеспокоен тем, что, так как валидатор ранее возвращал "true", так как он не хотел ждать на ajax, теперь нет никакого способа вернуть "false", и форма будет думать, что она в действительном государство.

ВОПРОС: Вызывает ли функция addErrorClasses пометить поле как недопустимое, что сделает форму недопустимым?

Foundation.Abide.defaults.validators.validate_username =
    function($el,required,parent) {
    // parameter 1 is jQuery selector
        if (!required) return true;

        let val = $el.val();

        // Step 1 - check that it meets the pattern
        if (!val.length)
            return true;

        let valid = new RegExp(username_pattern).test(val);
        if (!valid)
            return false;

        // Step 2 - check that the username is available
        $.ajax({
            url: "http://localhost:3000/users/"+val,
        }).done(function(data) {
            $('#demo-form').foundation('addErrorClasses',$el);
            console.log(data);
        }).fail(function() {
            // do nothing for now
        });

        return true;
};

1 ответ

Да, вызов addErrorClasses пометит этот элемент управления как "недействительный", но это зависит от того, где и как вы вызываете метод.

Поскольку вы выполняете ajax(то есть асинхронный), он возвращает true по умолчанию. К этому времени ваш элемент управления станет "действительным", и когда ajax получит ответ от "URL", он установит "недействительным" на основе вашего кода.

Когда вы пытаетесь отправить форму, базовая структура сбрасывает все элементы управления, т.е. удаляет все атрибуты "data-invalid", а затем выполняет все стандартные и пользовательские валидаторы. Тем не менее ваш метод возвращает true. Он не ждет ответа от вашего AJAX.

Форма будет отправлена, даже если у вас есть ошибки в вашем контроле.

Другие вопросы по тегам