2012-07-16 2 views
0

У меня этот код http://jsfiddle.net/meridius/ysDGm/ где проблема с out.id переменная в append часть. По причинам, которые я не могу объяснить, эта переменная пуста в этой части.глобальная переменная пуста внутри функции

Я думаю, что проблема связана с областью этой переменной, и я пробовал все, но не повезло. Обратите внимание, что проблема не с AJAX, это нормально!

Вот сокращенный вариант этого 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

Поиск "возврат Jquery значение Аякса". Вы найдете достаточно дубликатов. Причина очень проста: * значение переменной [global] не было установлено в той точке, в которой оно используется *. Это все. –

+0

http://stackoverflow.com/questions/560307/how-do-i-itit-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-from-a-getjson-function? rq = 1, http://stackoverflow.com/questions/1632039/return-value-from-ajax-call, http://stackoverflow.com/questions/1181665/is-there-a-way-to-return-a-value-xml-in-my-case-from-a-jquery-ajax-call? rq = 1 –

+1

AJAX является асинхронным, поэтому поток кода продолжается, пока выполняется вызов ajax. Вы пытаетесь использовать переменную 'out', прежде чем она будет установлена. Попробуйте переместить код после вашего вызова ajax в обратный вызов успеха. – MrOBrian

ответ

0

Отлично, спасибо, ребята!

на основе ваших предложений, которые я переместил на добавление кода к успеху обратного вызова функции AJAX И Я также должен был создать переменную $ (это), так как она отличается $ (это) внутри AJAX, чем снаружи. ;)

Рабочая JQuery часть теперь выглядит следующим образом:

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 является асинхронным, и поэтому установка переменной out внутри него будет происходить после того, как остальные функции.

 $.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

Вы должны поместить код добавления в блок успеха. Поскольку аякс-вызов является асинхронным, оператор append запускается до того, как переменная 'out' задается обратным вызовом 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()); 
}); 
Смежные вопросы