Передача функции обратного вызова с включенными параметрами?
У меня этот код ниже.
function getGrades(grading_company) {
if (grading_company == 'Not Specified') {
// Remove grades box & show condition box
showConditionBox();
} else {
// Set file to get results from..
var loadUrl = "ajax_files/get_grades.php";
// Set data string
var dataString = 'gc_id=' + grading_company;
// Set the callback function to run on success
var callback = showGradesBox;
// Run the AJAX request
runAjax(loadUrl, dataString, callback);
}
}
function runAjax(loadUrl, dataString, callback) {
jQuery.ajax({
type: 'GET',
url: loadUrl,
data: dataString,
dataType: 'html',
error: ajaxError,
success: function(response) {
callback(response);
}
});
}
Изменить: Вот функция, которая вызывается как функция обратного вызова:
function showGradesBox(response) {
// Load data into grade field
jQuery('#grade').html(response);
// Hide condition fields
jQuery('#condition').hide();
jQuery('#condition_text').hide();
// Show grade fields
jQuery('#grade_wrapper').show();
jQuery('#grade_text_wrapper').show();
}
Теперь, если я хотел передать переменную grading_company
функции обратного вызова в качестве параметра, есть ли способ сделать это, не добавляя ее в качестве другого параметра в вызове runAjax
? Я пытаюсь сохранить функцию runAjax
открытой для другого использования, поэтому я не хочу передавать какие-либо дополнительные параметры; но если он может каким-то образом быть включен в обратный вызов, тогда большой.
Ответы
Ответ 1
измените свой обратный вызов на анонимную функцию:
// Set the callback function to run on success
var callback = function () {
showGradesBox(grading_company);
};
Это позволяет передавать параметры во внутреннюю функцию.
Изменить: разрешить ответ ajax:
// Set the callback function to run on success
var callback = function (response) {
showGradesBox(grading_company, response);
};
Ответ 2
Другая возможность заключается в том, чтобы вместо dataString
do dataObject
выполнить этот объект для обратного вызова. Например:
function getGrades(grading_company) {
if (grading_company == 'Not Specified') {
// Remove grades box & show condition box
showConditionBox();
} else {
// Set file to get results from..
var loadUrl = "ajax_files/get_grades.php";
// Set data object
var dataObject = {
'gc_id' : grading_company
/*to do multiples..
'item1' : value1,
'item2' : value2,
'etc' : etc */
}
// Set the callback function to run on success
var callback = showGradesBox;
// Run the AJAX request
runAjax(loadUrl, dataObject, callback);
}
}
function runAjax(loadUrl, dataObject, callback) {
jQuery.ajax({
type: 'GET',
url: loadUrl,
data: $.param(dataObject),
dataType: 'html',
error: ajaxError,
success: function(response) {
callback(response, dataObject);
}
});
}
Обратите внимание на добавление $.param()
.
Затем в функции обратного вызова вы должны знать, какие данные вы после. Если function setGrades(resp, data) { ... }
был обратным вызовом, вы можете получить доступ к значениям в setGrades
function setGrades(resp, data) {
alert( data.gc_id);
}
ИЗМЕНИТЬ
После тестирования я понимаю, что $(dataObject).serialize()
не будет работать. Поэтому я обновил для использования $.param()
. Подробнее см. этот пост..