2010-10-25 121 views
0

我可能錯在這裏實際發生的事情,但我有3個Html.dropdownlists。即時通訊使用jquery來處理實際上工作的過濾。但是,我認爲可能會有一些奇怪的行爲,因爲在下一個函數被調用之前數據並未完成加載。JQuery:強制頁面暫停,直到數據完成加載

例如:

一些背景。 公司:擁有多個現場辦事處 現場辦公室:擁有多個設施 因此,從邏輯上講,當您更換公司時,總部外辦事處應該改變,然後改變設施。

$(function() { 
     $(document).ready(function() { 
      var cid = $("#CompanyId").val(); 
      $.post("/ManifestSearch/GetFilteredFieldOffices", { id: cid }, function (data) { 
       $("#FieldOfficeId").loadSelect(data); 
      }); 
      var fid = $("#FieldOfficeId").val(); 
      $.post("/ManifestSearch/GetFilteredFacilities", { id: fid }, function (data) { 
       $("#FacilityId").loadSelect(data); 
      }); 
     }); 
    }); 

現在,當頁面加載時,一切看起來都很好。所有的下拉列表都有正確的數據。

當我更換公司時,這個電話。

$(function() { 
     $('#CompanyId').change(function() { 
      var cid = $(this).val(); 
      $.post("/ManifestSearch/GetFilteredFieldOffices", { id: cid }, function (data) { 
       $("#FieldOfficeId").loadSelect(data); 
      }); 
      var fid = $("#FieldOfficeId").val(); 
      $.post("/ManifestSearch/GetFilteredFacilities", { id: fid }, function (data) { 
       $("#FacilityId").loadSelect(data); 
      }); 
     }); 
    }); 

這改變了外地辦事處,以正確的名單,然而無論外地辦事處成立公司變更之前發生變化的設施。我對jquery完全不瞭解確切的發生了什麼,但我的直覺告訴我這兩個帖子同時發生,第二個帖子發生在第一個帖子完成之前。

回答

2

這是一個異步請求的本質..你不知道它們將以什麼順序完成,所以你不能總是假設第一個數據會被第二個數據使用。

理想情況下,您的第二個請求應該位於第一個請求的onSuccess回調函數內,並使用onFailure/onError函數處理函數來處理出現的任何問題。

+0

我看到你可以設置async爲false的地方。真的嗎? – 2010-10-25 20:25:03

+0

明白了。我把第二個控制器調用放在第一個控制器的成功之內。謝謝! – 2010-10-25 20:31:06

+0

另請注意 - 有一些jQuery插件會按順序排列要接收的Ajax請求。我親自使用並享受http://www.protofunc.com/scripts/jquery/ajaxManager/ – Jono 2010-10-25 20:36:31

相關問題