getJSON内部事件遇到传入函数调用的引用错误

时间:2012-09-27 20:36:12

标签: javascript jquery asp.net-mvc-3 html5 asynchronous

我有一个方法,使用对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范例。我究竟做错了什么?

1 个答案:

答案 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);
}