以下のように、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は非同期操作であり、そこで問題が発生していると思います。非同期パラダイムに精通していません。正確には、私は何を間違っているのですか?