1

我在 jqGrid 中的一个列上使用了格式化程序。格式化程序使用一些逻辑来决定显示什么,在某些情况下,它会调用 ajax 方法。我已经在 Fiddler 中验证了正确的数据来自我的 ajax 调用。我还在 Chrome 调试工具中验证了我的变量设置是否正确。但是,序列完全不正确,因此我的列中的返回值是“未定义”。我可以在调试工具的时间线中看到我的 getJSON 调用在 jqgrid 已经加载后被调用。

我首先尝试了这个:

function myFormatter(cellvalue, options, rowObject) 
{
    if (rowObject[0] == something) {
        $.getJSON('@Url.Action("MyAction", "MyController"), function (myResult) {
            var myObject = myResult[0];
            return myObject.myID;
        });
    }
    else {
        return "";
    }
}

我还尝试使用带有 async=false 的 ajax 调用,并且我尝试了 type 和 dataType 的不同值,但结果都是一样的:

function myFormatter(cellvalue, options, rowObject) 
{
    if (rowObject[0] == something) {
        $.ajax({
            type: 'POST',
            url: '@Url.Action("MyAction", "MyController"),
            async: false,
            success: (function(result) {
                var myObject = myResult[0];
                return myObject.myID;
            })
        });        
    }
    else {
        return "";
    }
}
4

1 回答 1

2

似乎您应该能够通过使用同步 AJAX 调用和闭包来使其工作:

function myFormatter(cellvalue, options, rowObject) 
{
    var value = "";

    if (rowObject[0] == something) {
        $.ajax({
            type: 'POST',
            url: '@Url.Action("MyAction", "MyController"),
            async: false,
            success: (function(result) {
                var myObject = myResult[0];
                value = myObject.myID;
            })
        });        
    }

    return value;
}

不过,一般来说,使用同步 AJAX 调用是一种不好的做法,因为它们可能会在不确定的时间内阻塞 UI。如果您的网格中有很多行,这种情况可能特别糟糕,因为每行将进行一次 AJAX 调用。

如果可以,更好的方法可能是提前检索 ID 并将它们缓存在页面本地,或者只是在服务器端进行格式化。与往常一样,使用您的最佳判断。

于 2012-09-21T13:59:02.287 回答