web-dev-qa-db-ja.com

含まれるパラメーターでコールバック関数を渡しますか?

私はこれをコードの下に持っています..

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関数を他の使用法に対して開いたままにしようとしているので、追加のパラメーターを渡したくありません。しかし、どうにかしてコールバック内に含めることができれば、素晴らしいことです。

24
Brett

コールバックを匿名関数に変更します。

// 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);
};
45
jbabey

別の可能性は、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);
}
_

[〜#〜] edit [〜#〜]

テスト後、$(dataObject).serialize()は機能しないことがわかりました。そこで、$.param()を使用するように更新しました。詳しくは this SO post をご覧ください。

2
jwatts1980