2016-08-03 179 views
2

我想弄清楚如何傳遞我的回調附加參數。到目前爲止,我有以下代碼。將參數傳遞給回調

$("#refine_mp_type").change(function(){ 
    var mp_type = $(this).val(); 
    var country_id = $('#refine_country').val(); 
    var dropdown = $('#refine_grade').find('select'); 
    getMPTypeGrades(country_id, mp_type, populateGradesDropdown); 
}); 

function getMPTypeGrades(country_id, mp_type, callback){ 
    display_wait_dialog ("Please Wait", "Loading grades..."); 
    $.ajax(
    { 
     //do ajax 
    }) 
    .done(function(data){ 
     callback(data); 
    }) 
    .fail(//do something) 
    .always(//do something); 
} 

populateGradesDropdown(data){ 
    //populate the dropdown with the returned data 
} 

我至今對如何實現這一想法是:

  1. 我可以在下拉變量設置爲全局範圍和訪問它的方式(會污染全局範圍)。
  2. 我可以通過下拉元素獲取MPTypeGrades函數,然後將其傳遞給回調函數。 (我想保持getMPTypeGrades儘可能通用,我不知道是否我總是會傳遞一個接受JQuery元素的回調函數。)

什麼是傳遞JQuery元素和Ajax響應作爲我的回調參數?

回答

2

可以綁定下拉菜單回調函數:

$("#refine_mp_type").change(function(){ 
    var mp_type = $(this).val(); 
    var country_id = $('#refine_country').val(); 
    var dropdown = $('#refine_grade').find('select'); 
    getMPTypeGrades(country_id, mp_type, populateGradesDropdown.bind(null, dropdown)); 
}); 

然後

populateGradesDropdown(dropdown, data){ 
    //populate the dropdown with the returned data 
} 
+0

當你設置'dropdown'作爲第一這個綁定的參數,你可以用'this'關鍵字在'populateGradesDropdown'中訪問它。 – Mouser

+0

是的,但'populateGradesDropdown'可能是通用函數,可能會使用它的上下文。但你是對的。 – Maxx

2

嘗試使用jQuery DeferredjQuery when。基本上,你創建一個具有掛起狀態的延遲對象並將其返回給調用者。 jQuery when只有在解析或拒絕延遲對象時才執行回調函數。當您的ajax請求完成時,.resolve.reject將被調用。這將觸發調用者的回調方法。

我還沒有測試過這個代碼,但它應該或多或少地工作。

$("#refine_mp_type").change(function() { 
    var mp_type = $(this).val(); 
    var country_id = $('#refine_country').val(); 
    var dropdown = $('#refine_grade').find('select'); 
    $.when(getMPTypeGrades(country_id, mp_type)).then(function(result) { 
     //populate dropdown 
    }); 
}); 

function getMPTypeGrades(country_id, mp_type) { 
    var def = $.Deferred(); 
    display_wait_dialog ("Please Wait", "Loading grades..."); 
    $.ajax(
    { 
     //do ajax 
    }) 
    .done(function(data) { 
     def.resolve(data); 
    }) 
    .fail(function(err) { 
     def.reject(err); 
    }) 
    .always(function() { 
     hide_wait_dialog(); 
    }); 
    return def; 
} 
+0

鏈接是好的,但給一點關於'被緩存的'的解釋。 – Mouser

+1

我已經更新了我的答案。 – springrolls

0

,而不是傳遞一個回調(它可以創造回調的「金字塔」的代碼),你應該只返回推遲AJAX對象getMPTypeGrades。然後,你可以使用更改處理程序中的標準.done()/.then()功能:

$("#refine_mp_type").change(function(){ 
    var mp_type = $(this).val(); 
    var country_id = $('#refine_country').val(); 
    var dropdown = $('#refine_grade').find('select'); 
    getMPTypeGrades(country_id, mp_type).then(populateGradesDropdown); 
}); 

function getMPTypeGrades(country_id, mp_type){ 
    display_wait_dialog ("Please Wait", "Loading grades..."); 
    return $.ajax(
    { 
     //do ajax 
    }) 
    .fail(//do something) 
    .always(//do something); 
} 

populateGradesDropdown(data){ 
    //populate the dropdown with the returned data 
} 
0

您可以參考原來的下拉變量在回調函數體:

var dropdown = /*whatever*/; 
getMPTypeGrades(country_id, mp_type, function(data) { 
    populateGradesDropdown(data, dropdown); 
}); 

$.ajax({ 
}).done(function(data){ 
    callback(data); 
}) 

function populateGradesDropdown(data, dropdown){ 
    alert("data=" + data); 
    alert("dropdown=" + dropdown); 
}