我有一个方法,使用对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()方法遇到引用错误: / p>
function textFieldRowClickHandler(rowData) {
$myTextFieldHere.val(rowData.SomeProperty);
}
当我打开对话框(导致PopulateTable运行并绑定其中的事件),并选择一条记录(从而触发click事件)时,我不断收到引用错误,因为rowData.SomeProperty未定义,甚至虽然回调是将click事件绑定到每个tr标记,当它被单击时,关闭对话框,获取值,构建一个对象,并将其传递给给定的方法。
如上所述 - 我知道getJSON是一个异步操作,而我认为我的问题就出现了 - 我不熟悉Async范例。我究竟做错了什么?
答案 0 :(得分: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);
}