2012-08-23 115 views
1

我目前有一些JQuery代碼,我試圖確保只有在第一個塊中的AJAX調用完成後才執行一個代碼塊。然而,我遇到了一些問題 - 我試圖使用JQuery Deferred方法來執行此操作(下面的代碼),但第一個或第二個代碼塊都沒有運行,所以我假設我處於錯誤的軌道上。Jquery - 在AJAX調用完成後確保代碼塊執行?

我是新來的延期方法,所以我希望有人能指出我在正確的方向,或指出另一個(也許更好)的方式做到這一點。

function makeChains(){ 
    $('.chained_to_vehicle_make_selector').remoteChainedTo('.chained_parent_vehicle_make_selector', '/models.json'); 
    $('.chained_to_vehicle_model_selector').remoteChainedTo('.chained_parent_vehicle_model_selector', '/trims.json'); 
    $('.chained_to_vehicle_trim_selector').remoteChainedTo('.chained_parent_vehicle_trim_selector', '/model_years.json'); 
} 

var chainCall = $.Deferred(function() { 
    makeChains(); 
}); 

chainCall.done(function() { 
    $(".chzn-select").chosen(); 
    $(".chained_parent_vehicle_make_selector").chosen().change(function() {$(".chained_to_vehicle_make_selector").trigger("liszt:updated"); }); 
    $(".chained_parent_vehicle_model_selector").chosen().change(function() {$(".chained_to_vehicle_model_selector").trigger("liszt:updated"); }); 
    $(".chained_parent_vehicle_trim_selector").chosen().change(function() {$(".chained_to_vehicle_trim_selector").trigger("liszt:updated"); }); 
    $(".chained_child").chosen(); 
}); 

我也嘗試添加chainCall.resolve();到了最後,但無濟於事。

任何人都可以協助嗎?

編輯:我看了一下這裏的解決方案:Waiting for jQuery AJAX response(s)這似乎可以工作,但我認爲問題可能是remoteChainedTo似乎沒有內置回調?我是否需要修改代碼來添加回調才能工作,或者JQuery能夠幫助我嗎? remoteChainedTo插件使用getJSON從網址中提取數據。

編輯2:沒有太多的愛這個問題 - 任何進一步的想法?

回答

0

考慮remoteChained方法返回一個jqXHR對象(延期),你可能會想嘗試類似:

var dfds = [], 
list = ['vehicle_make_selector','vehicle_model_selector','vehicle_trim_selector'], 
urls = ['/models.json','trims.json','/model_years.json']; 

for(var i=0;i<list.length;i++){ 
    dfds.push($('chained_to_' + list[i]).remoteChainedTo('chained_parent',urls[i]); 
} 

$.when.apply($,dfds).done(function(){ 
    $(".chzn-select").chosen(); 
    //... rest of the code. 
}) 
相關問題