2010-03-12 7 views
0

J'essaie d'utiliser le validateur Jquery intégré sur ma page. Le problème est que j'ai certains champs qui sont seulement nécessaires si le JobID (entré dans un autre champ) n'existe pas déjà dans notre base de données. J'ai un service simple qui prend simplement JobID et renvoie True ou False basé sur si le JobID existe, mais je ne peux pas sembler obtenir cette information où je le veux. Un exemple de code:

$("#dep_form").validate({ 
     rules: { 
      JobID: { 
       required: true, 
       digits: true, 
       minlength: 3 
      }, 
      OrgName: { 
       required: function(element) { //This field is required if the JobID is new. 
        return $("#jobinfo").html().length==15; } 
      } 
     }, 
     messages: { 
      JobID: { 
       required: "Enter a Job Number.", 
       digits: "Only numbers are allowed in Job ID's.", 
       minlength: "Job Number must be at least 3 digits" 
      }, 
      OrgName: { 
       required: "Select a Practice from the dropdown list." 
      } 
     }, 
     errorClass: "ui-state-error-input", 
    errorLabelContainer: "#errorbox", 
    errorElement: 'li', 
    errorContainer: "#validation_errors", 
    onfocusout: false, 
    onkeyup: false, 
    focusinvalid: false 
}; 

Actuellement, j'utilise une méthode paresseuse pour valider (voir ci-dessus). Cependant, j'ai maintenant accès à un service en utilisant l'URL:

var lookupurl = "/deposits/jobidvalidate/?q=" + $("#id_JobID").val() + "&t=" + new Date().getTime(); 

qui est une page qui contiendra simplement le mot Vrai ou faux, selon que cette JobID donnée existe. J'ai essayé une demi-douzaine de façons différentes de définir des variables et des fonctions d'appel dans les fonctions et je n'arrive toujours pas à retourner la valeur de cette page (que j'essaye d'accéder avec $ .get()) à mon validateur , de sorte que requis est défini sur true lorsque le travail n'existe pas et false si le travail existe déjà. Aucune suggestion? Merci.

Répondre

1

On dirait que vous utilisez une requête asynchrone Ajax (le $.get). Je suppose votre code ressemble à ceci:

var result; 

$.ajax({ 
    url: lookupurl, 
    success: function() { result = /* parse the response here */; }, 
    dataType: 'html' 
}); 

return result; 

Mais cela ne fonctionnera pas parce que result sera retourné avant le rappel success a tiré (et ce faisant, définissez la valeur de result). Si ma supposition est bonne, alors vous devez faire votre $get synchrone, mais vous devez utiliser $.ajax pour le faire.

Modifier @Pointy:$.get est, selon the API, abréviation pour

$.ajax({ 
    url: url, 
    data: data, 
    success: success, 
    dataType: dataType 
}); 

... qui est, par défaut, asynchrone.

+0

Je pense que '$ .get()' est toujours synchrone. – Pointy

+0

Pointy, voir mon édition. –

+0

Cette description (que j'obtiens le résultat retourné AVANT que le rappel ne se déclenche) est exactement le problème. Je suppose que maintenant il semble assez évident, je vais essayer d'utiliser $ .ajax au lieu de $ .get et en spécifiant async: false. Merci! –

0

Vous devriez pouvoir obtenir le résultat du "get" en tant que paramètre du rappel que vous avez passé.

var jobIdExists; 
$.get(url, function(data) { jobIdExists = data =="True"; }); 
0

C'était en effet un problème de synchronisation/asynchrone. J'ai été capable de le résoudre en utilisant:

var lookupurl = "/deposits/jobidvalidate/?q=" + $("#id_JobID").val() + "&t=" + new Date().getTime(); 
var result; 
$.ajax({ 
    url: lookupurl, 
    success: function(data) { result = data;}, 
    dataType: 'html', 
    async: false 
}); 
return result; 
Questions connexes