2014-02-03 3 views
0
$.validator.addMethod("uniqueEmail", function() { 

     $.ajax({ 
     type: "POST", 
     url: "/user/check_email", 
     data: { 
       email: $("#email").val() 
     }, 
     success: function(data) { 
      console.log(data); 
      if(data == 1) 
      { 
       return false; 
      } 
      else 
      { 
       return true; 
      } 
     } 

    }) 

}, "That email already exists"); 

email: { 
        required: true, 
         email: true, 
         uniqueEmail: true 
      } 

Я не знаю, почему uniqueEmail всегда отображает ошибку, даже если я возвращаю true или false, что не так?jQuery validator addMethod всегда отображает ошибку

ответ

3

Проблема в том, что ваш вызов ajax является асинхронным, а функция, которую вы даете .addMethod(), должна сразу же вернуть значение.

Но не поддавайтесь искушению установить async: false. Вместо этого используйте remote method.

Я считаю, что это будет выглядеть примерно так:

email: { 
    required: true, 
    email: true, 
    remote: { 
     url: "/user/check_email", 
     type: "post" 
    } 
} 

Когда вызов Ajax производится с помощью дистанционного метода, он будет автоматически включать параметр с именем «электронная почта» со значением ввода электронной почты, так что вы там хорошо. Вам просто нужно изменить код сервера, чтобы он возвращал "true" или "false", а не "0" или "1". (Примечание:.. Вы возвращаетесь "0" указать электронную почту не используется, а это значит, он уникален Теперь вы должны вернуться "true" в этом случае)

UPDATE:

Вы приняли этот ответ, но последуйте за тем, как вы можете указать сообщение об ошибке, вы можете оставить ответ своего сервера как можно ниже:

email: { 
    required: true, 
    email: true, 
    remote: { 
     url: "/user/check_email", 
     type: "post", 
     dataFilter: function(data) { 
      return (data == 1) ? "true" : "That email already exists"; 
     } 
    } 
} 
+0

да, но я не могу обработать этот удаленный метод, потому что я не могу Не знаю, как установить сообщение об ошибке в зависимости от ответа сервера true или false, поэтому я использовал addMethod, потому что там я могу установить сообщение об ошибке, default его показать мне «исправить это поле» –

+0

Похоже, вы получаете сообщение по умолчанию, если вы возвращаете «false», но если вы вернете любую другую строку (кроме «true»), эта строка будет использоваться в качестве сообщения об ошибке. –

+0

Итак, где я могу вернуть эту строку? используя удаленную функцию? –

2

Анонимная функция, которую вы передаете addMethod, не возвращает значение. Вы используете обработчик jQuery ajax, который использует функцию на success. Операторы return находятся внутри этой функции.

0

Ответ от сервера предоставляется асинхронно. Попробуйте добавить async: false в параметры в соответствии с jQuery's documentation

EDIT

И как сказал @BotskoNet, что возвращается значение внутри анонимной функции.

Смежные вопросы