2012-07-16 5 views
0

J'ai ce code http://jsfiddle.net/meridius/ysDGm/ où le problème est avec out.id variable dans append partie. Pour des raisons que je ne peux pas expliquer, cette variable est vide dans cette partie.variable globale est vide dans la fonction

Je pense que le problème est avec la portée de cette variable et j'ai tout essayé mais sans succès. S'il vous plaît noter, le problème n'est pas avec AJAX, ça fonctionne bien!

version est raccourcies ici de ce Fiddle:

<tr> 
    <td>one</td> 
    <td> 
     <select name="zadavatel"> 
      <option value="0">-- vyberte --</option> 
      <option value="new">-- nový zadavatel --</option> 
     </select> 
    </td> 
</tr> 
var out = {}; 
$('select').bind("change", function() { 
    if ($(this).val() == "new") { 
    var nazev = prompt('Question', 
       $(this).parent().siblings(':first-child').text()); 
    if (nazev == null) { 
     $(this).val($.data(this, 'current')); 
     return false; 
    } else { 
     var pole2 = {}; 
     pole2["nazev"] = nazev; 
     $.ajax({ 
     type : "POST", 
     cache : false, 
     url  : "./pokus_zad.php", 
     data : JSON.stringify(pole2), 
     success : function(data) { 
      out = JSON.parse(data); //data.id 
     } 
     }); 
     out.id = 15; // this work, but it SHOULD work without it (with AJAX) 
     $(this).closest('table').find('select').each(
     function() { 
      $(this).append($('<option>', { "value" : out.id }).text(nazev)); 
     }); 
     $(this).closest('select').val(out.id).attr('selected', 'selected'); 
    } 
    } 
    $.data(this, 'current', $(this).val()); 
}); 
+2

Rechercher "retour jquery valeur ajax". Vous trouverez suffisamment de doublons. La cause est très simple: * la valeur de la variable [global] n'a pas été définie au point où elle est utilisée *. C'est tout. –

+0

http://stackoverflow.com/questions/560307/how-do-i-edit-a-global-variable-in-a-jquery-each-function?rq=1, http://stackoverflow.com/questions/6917796/extjs-return-ajax-return-value, http://stackoverflow.com/questions/8532082/return-value-of-post-call, http://stackoverflow.com/questions/31129/how-can -i-return-a-variable-à partir d'une fonction-getjson? rq = 1, http://stackoverflow.com/questions/1632039/return-value-from-ajax-call, http://stackoverflow.com/questions/1181665/est-il-un-moyen-de-renvoyer-une-valeur-xml-dans-mon-cas-de-un-jquery-ajax-call? rq = 1 –

+1

AJAX est asynchrone, donc flux de code continue pendant que l'appel ajax est en cours. Vous essayez d'utiliser votre variable 'out' avant qu'elle ne soit définie. Essayez de déplacer le code après votre appel ajax dans le rappel de succès – MrOBrian

Répondre

0

Super, merci les gars! Sur la base de vos suggestions, j'ai déplacé mon code append à succès callback de la fonction AJAX ET J'ai aussi dû créer une variable pour $ (this) car elle est différente de $ (this) à l'intérieur d'AJAX qu'à l'extérieur. ;)

La partie JQuery travail ressemble maintenant à ceci:

var out = {}; 
$('select').bind("change", function() { 
    if ($(this).val() == "new") { 
     var nazev = prompt('Zadejte název zadavatele', $(this).parent().siblings(':first-child').text()); 
     if (nazev == null) { 
      $(this).val($.data(this, 'current')); 
      return false; 
     } else { 
      var select = $(this); 
      var pole2 = {}; 
      pole2["nazev"] = nazev; 
      $.ajax({ 
       type  : "POST", 
       cache  : false, 
       url   : "./pokus_zad.php", 
       data  : JSON.stringify(pole2), 
       success : function(data) { 
        out = JSON.parse(data); //data.id 
        select.closest('table').find('select').each(
         function() { 
          $(this).append($('<option>', { "value" : out.id }).text(nazev)); 
         }); 
        select.val(out.id).attr('selected', 'selected'); 
       } 
      }); 
     } 
    } 
    $.data(this, 'current', $(this).val()); 
}); 
0

AJAX est asynchrone, et donc la valeur de la variable out de l'intérieur, il se produira après le reste de la fonction.

 $.ajax({ 
     type : "POST", 
     cache : false, 
     url  : "./pokus_zad.php", 
     data : JSON.stringify(pole2), 
     success : function(data) { 
      out = JSON.parse(data); //data.id 
      $(this).closest('table').find('select').each(
      function() { 
       $(this).append($('<option>', { "value" : out.id }).text(nazev)); 
      }); 
      $(this).closest('select').val(out.id).attr('selected', 'selected'); 
     } 
     }); 
0

Vous devez placer le code d'ajout dans le bloc de réussite. Comme l'appel ajax est asynchrone, l'instruction append est exécutée avant que la variable 'out' ne soit définie par le rappel ajax.

var out = {}; 
$('select').bind("change", function() { 
    if ($(this).val() == "new") { 
    var nazev = prompt('Question', 
       $(this).parent().siblings(':first-child').text()); 
    if (nazev == null) { 
     $(this).val($.data(this, 'current')); 
     return false; 
    } else { 
     var pole2 = {}; 
     pole2["nazev"] = nazev; 
     $.ajax({ 
     type : "POST", 
     cache : false, 
     url  : "./pokus_zad.php", 
     data : JSON.stringify(pole2), 
     success : function(data) { 
      out = JSON.parse(data); //data.id 
      $(this).closest('table').find('select').each(
      function() { 
       $(this).append($('<option>', { "value" : out.id }).text(nazev)); 
      }); 
      $(this).closest('select').val(out.id).attr('selected', 'selected'); 
     } 
     }); 
    } 
    } 
    $.data(this, 'current', $(this).val()); 
}); 
Questions connexes