JQuery валидатор addMethod, независимо от того, что отображает сообщение об ошибке - PullRequest
1 голос
/ 22 июня 2011

Я борюсь с некоторой проверкой, используя плагин валидатора jQuery.

В основном я проверяю, существует ли имя пользователя, поэтому я использовал addMethod , чтобы создать свой собственный метод. Я отправляю запрос через AJAX на контроллер (контроллер как в шаблоне MVC), который запрашивает базу данных и генерирует ответ, говорящий, существует ли имя пользователя или нет. Вот код:

$.validator.addMethod("username_available", function(value, element) {
    $.ajax({
        url: MyPostURL,
        type: "POST",
        dataType: "html",
        data: ({username: jQuery.trim($("#username").val()),
              }),
        success: function(data) {
            if (data == "True")
                return true; // Available
            else
                return false; // Already exists, not available
        }
   })
}, "Username not available.");

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

Ответ от MyPostURL - О.К. Я сделал некоторую отладку, поместив некоторые оповещения (), и результаты имели смысл. Я убедился, что контроллер эхом вместо того, чтобы вернуться.

Насколько я могу судить, логика в методе выглядит нормально, поэтому я должен что-то упустить.

Кто-нибудь может пролить свет на это?

T.I.A.

1 Ответ

3 голосов
/ 22 июня 2011

Ваш $.ajax вызов асинхронный, поэтому ваш валидатор возвращается до завершения вызова AJAX;оператор return в вашем обработчике успеха не возвращает значение из вашего валидатора, он только возвращает значение из обработчика успеха, и никого не волнует, что возвращает ваш обработчик успеха.Ваша функция обратного вызова валидатора вообще не возвращает никакого значения, и отсутствие значения интерпретируется механизмом валидатора как «false».

Вы можете сделать $.ajax синхронным:

$.validator.addMethod("username_available", function(value, element) {
    var is_valid = false;
    $.ajax({
        // as before...
        async: false,
        success: function(data) {
            is_valid = data == 'True';
        }
   });
   return is_valid;
}, "Username not available.");

Но это заблокирует браузер до завершения вызова $.ajax.Это, вероятно, нормально для простой проверки «имя пользователя доступно».

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...