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 运行并绑定其中的事件)并选择一条记录(从而触发 click 事件)时,我不断收到引用错误,因为 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 回答