Плагин проверки jQuery: valid () не работает с удаленной проверкой? - PullRequest
4 голосов
/ 24 марта 2010

Я начал с того, что следовал этому удивительному учебнику , но хотел выполнить проверку на keyup и разместить свои ошибки где-нибудь еще. Удаленная проверка показывает свое собственное сообщение об ошибке в соответствующее время, заставляя меня думать, что оно работает. Но если я спрашиваю конкретно, допустимо ли поле с удаленной проверкой, оно говорит «нет», на самом деле это не так.

В application.js у меня есть это ...

    $("#new_user").validate({
    rules: {
        "user[login]": {required: true, minlength: 3, remote: "/live_validations/check_login"},
    },
    messages: {
        "user[login]": {required: " ", minlength: " ", remote: " "},
    }
});

$("#user_login").keyup(function(){
    if($(this).valid()){
        $(this).siblings(".feedback").html("0");
    }else{
        $(this).siblings(".feedback").html("1");
    }
})

А потом это в приложении rails ...

def check_login
    @user = User.find_by_login(params[:user][:login])
    respond_to do |format|
      format.json { render :json => @user ? "false" : "true" }    
    end
  end

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

Любая идея, чтобы исправить это, или новый взгляд на это, была бы большой помощью.

1 Ответ

6 голосов
/ 07 октября 2010

Когда вы вызываете $ (this) .valid (), он в конечном итоге вызывает / live_validations / check_login асинхронно. Метод valid () возвращается сразу же, не дожидаясь окончания check_login, и, поскольку он не знает, каким будет результат, он просто возвращает false.

Глядя на код плагина Validation, я думаю, вам следует вместо этого вызвать метод element (), который вернет true, false или undefined - он вернет undefined во время выполнения асинхронного вызова, тогда как valid () возвращает только правда или ложь. Когда вы получаете неопределенное значение, вы знаете, что вам все еще нужно ждать ответа на ваш сервер.

Я думаю, что вы можете сделать что-то подобное (непроверенное, но с чем-то поиграть). Обратите внимание, что повторные вызовы element () не будут запускать новые вызовы Ajax; они делают это только если значение изменилось. Так что там нет никакого вреда.

function checkResult() {
   var valid = $(formSelector).validate().element('#user_login'); // Will not launch a new request if the value hasn't changed
   if (typeof valid == 'undefined') {
     setTimeout("checkResult()", 100);
   }
   else { // it's done!
     if(valid){
      $(this).siblings(".feedback").html("0");
     }else{
      $(this).siblings(".feedback").html("1");
     }
   }
};
$("#user_login").keyup(function(){
  $(formSelector).validate().element('#user_login'); // launches the remote request
  setTimeout("checkResult()", 100);
})
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...