2013-01-01 6 views
1

jQuery에 다음과 같은 문제가 있습니다. jQuery 문서 준비 호출 순서

  • 를 가져옵니다

    1. 로드
    2. #value_type <select> 항목의 데이터에 넣어 관련 데이터베이스
    3. 에서 일부 JSON 데이터를 가져 오기 문서 : I가 원하는

      function populate_select_from_json(select, json_url) { 
          select.empty(); 
          $.getJSON(json_url, function(data) { 
           $.each(data, function(key, value) { 
            $("<option></option>") 
             .attr("value", value.name) 
             .text(value.title) 
             .appendTo(select); 
           }); 
          }); 
          select.children(":first").attr("selected", true); 
      } 
      $(document).ready(function() { 
          var value_type = $("#value_type"); 
          populate_select_from_json(value_type, SOME_URL); 
      
          var unit = $("#unit"); 
          populate_select_from_json(unit, ANOTHER_URL + value_type.val()); 
      
      }); 
      

      :이 코드를 사용 #value_type 값을 선택하고 데이터베이스를 다시 쿼리하여 다른 선택 항목을 채 웁니다.

    문제는 내가 value_type.val()를 호출 할 때, 그것은 항상 #value_type <select>가 제대로 설치되어 있어도, null를 출력합니다. 여기서 내가 뭘 잘못하고 있니?

  • +1

    ** ** 잭스 ** 비동기 **입니다. 'value_type.val()'을 호출하는 순간, 필드는 아직 채워지지 않았습니다. 지연된 객체를 사용하여 Ajax 호출을 체인화하는 것이 좋습니다 : http://api.jquery.com/category/deferred-object/. –

    +0

    그냥 내가 생각했던 것! 들판이 아직 채워지지 않은 것처럼 보입니다. 브라우저가 내 스레드를 다른 스레드에서 호출하여 .ready 콜백의 포크를 호출합니까? – artonson

    +0

    데이터를 가져 오는 중 일부 백그라운드 프로세스가 시작되었지만 JS에 스레드가 없다고 생각합니다. –

    답변

    2

    이렇게 생각하면 promises으로 더 잘 작동 할 것입니다. (테스트되지 않은)이 라인을 따라

    :

    var populate_select_from_json = function($select, json_url) { 
        $select.empty(); 
        return $.getJSON(json_url, function(data) { 
         $.each(data, function(key, value) { 
          $("<option></option>") 
           .attr("value", value.name) 
           .text(value.title) 
           .appendTo($select); 
         }); 
         $select.children(":first").attr("selected", true); 
        }); 
    }; 
    

    $(document).ready(function() { 
        var $value_type = $("#value_type"); 
        var $unit = $("#unit"); 
    
        populate_select_from_json($value_type, SOME_URL).done(function(){ 
         populate_select_from_json($unit, ANOTHER_URL + $value_type.val()); 
        }); 
    }); 
    
    관련 문제