0

以下のように、MVCコントローラーへのJSON呼び出しを使用してテーブルにデータを入力するメソッドがあります。

pub.PopulateTable = function (args) {
    var page = 1,
        // ...variables snipped...
        OnRowClicked;

    // Unpack arguments...
    if (args != null) {
        // ...details snipped...

        OnRowClicked = args.OnRowClicked;
    }

    // Build path...
    path = path + controller + '/' + action + '/';
    if (actionId != null && actionId != '') {
        path = path + actionId + '/';
    }
    path = path + page;

    $.getJSON(path, function (data) {
        if (data.Values.length > 0) {
            // Clear table body, then inject list...
            $tableBody.html('');
            $.tmpl($template, data.Values).appendTo($tableBody);

            // ...snip various instructions, for brevity...

            // Add on-click returning...
            $('tr').click(function () {
                var $row = $(this),
                    rowData = {};

                rowData.SomeProperty = $row.children('#IdColumn').val();

                $modalDialog.modal('hide');
                OnRowClicked(rowData);  // Problem!!!
            });
        } else {
            $tableBody.html("<tr><td colspan=2>No entries...</td></tr>");
        }
    });

getJSONが非同期操作であるためか、メソッド引数オブジェクトを介して渡されたOnRowClicked()メソッドが、渡された次の(単純な)メソッドを使用しようとすると、参照エラーが発生します。

function textFieldRowClickHandler(rowData) {
    $myTextFieldHere.val(rowData.SomeProperty);
}

ダイアログを開いて(これにより、PopulateTableが実行され、その中のイベントがバインドされます)、レコードを選択すると(したがって、クリックイベントが発生します)、コールバックにもかかわらず、rowData.SomePropertyが未定義であるため、参照エラーが発生し続けます。クリックイベントをすべてのtrタグにバインドします。このタグは、クリックされるとダイアログを閉じ、値を取得してオブジェクトを作成し、それを指定されたメソッドに渡します。

上記のように、getJSONは非同期操作であり、そこで問題が発生していると思います。非同期パラダイムに精通していません。正確には、私は何を間違っているのですか?

4

1 に答える 1

1

OnRowClicked メソッドが呼び出されたときに、コンテキストが正しく設定されていないようです。

あなたが使用することができます:

OnRowClicked = args.OnRowClicked.bind(args);

また

OnRowClicked = $.proxy(args.OnRowClicked,args);

したがって、次のようになります。

pub.PopulateTable = function (args) {
var page = 1,
    // ...variables snipped...
    OnRowClicked;

// Unpack arguments...
if (args != null) {
    // ...details snipped...

    OnRowClicked = args.OnRowClicked.bind(args);
}
于 2012-09-27T21:28:34.553 に答える