0

我在 Xpage 上使用自定义控件来构建带有 jqGrid 的表。jqGrid 通过 JSON 接收数据并正确填充表格。

我的问题是 jqGrid 的排序功能。当表格首次构建时,我将自定义格式化程序应用于“docname”列的单元格值。我遇到的问题是在对该格式化程序的任何列进行排序后变得无法使用。该格式仍然适用,但这个特定的格式化程序构建了一个启动另一个 Xpage 的 url 并依赖于参数“docid”。

这是我的自定义格式化程序:

function openDocument(cellvalue, options, rowObject) {                          
return "<a target='#{javascript:compositeData.target}' title='Open Document' 
href='https://test.url.com?DocID=" +rowObject["docid"]+ 
"&action=#{javascript:compositeData.action}' class='doclink'>"
+ cellvalue + "</a>"; }

在对网格进行排序后,有什么方法可以将 rowObject“docid”返回到 openDocument 格式化程序中?

我研究了一些并找到了 onSortCol 事件并将其初始化如下:

 onSortCol: function(index,iCol,sortorder) {alert("Test")}

我在 onSortCol 初始化中的警报正在工作,我只需要在排序运行后找出如何设置我的“docid”参数,因为它当前在排序后设置为未定义。

我试过放入:

{rowObject["docid"]}

但这只会破坏排序。

我也读过这些帖子:

onSortCol 事件

JQGrid 排序 - 如何触发 onSortCol 事件

jqGrid - 是否可以在初始化后设置 onSortCol?

谢谢你的帮助。

编辑:

jqGrid 定义:

     $().ready(function(){
     jQuery("#listxGrid").jqGrid({
        url:'#{javascript:compositeData.url}',
        datatype: "json",
        colNames:#{javascript:compositeData.colNames},
        colModel:#{javascript:compositeData.colModel},
        shrinkToFit:  false,
        jsonReader: {
        repeatitems: false,
        id: '#{javascript:compositeData.colID}',
        root: function (obj) {
            if ($.isArray(obj)) return obj;
            if ($.isArray(obj.items)) return obj.items;
                                return [];
                            },
        page: function () { return 1; },
        total: function () { return 1; },
        records: function (obj) {
            if ($.isArray(obj)) return obj.length;
            if ($.isArray(obj.items))   return obj.items.length;
                                return 0;
                            }
                        },
        gridview: true,
        loadonce: true,
        ignoreCase: #{javascript:compositeData.ignoreCase},
        rowNum: #{javascript:compositeData.rowNum},
        rowList: #{javascript:compositeData.rowList},
        rownumbers: #{javascript:compositeData.showRowNumbers},
        height: #{javascript:compositeData.height},
        caption: '#{javascript:compositeData.caption}',
        pager: '#pagerxGrid',
        viewrecords: true,
        emptyrecords: '#{javascript:compositeData.emptyRecords}',
        sortable: true,
        onSortCol: function(index,iCol,sortorder) {alert(index)},
        grouping: #{javascript:compositeData.grouping},
        groupingView : { 
            groupField : #{javascript:compositeData.groupField},
            groupDataSorted : true,
            groupColumnShow : #{javascript:compositeData.showGroupCol}

                            }

                });
4

2 回答 2

1

我最终以这种方式解决了问题。在 jqGrid 上,它在第一次加载时从远程数据接收“docid”参数就好了,但是一旦调用排序函数,它将被设置为“未定义”。

正如@PerHenrikLausten 在他的链接中指出的那样,在 onload 函数完成后,此远程数据类型将切换为本地数据。通过将 docid 加载到隐藏列中,在切换数据类型后,它可以作为我的格式化程序的参数使用。

通过增加:

'Docid' as a colName & {name:'docid', index:'docid', hidden: true} to the colModel

它允许我从我设置为 true 的任何列中对 jqGrid 进行排序,其中 docid 参数不应该是“未定义的”。

谢谢各位的意见。

于 2013-08-02T17:35:30.053 回答
1

看看这个答案,它建议使用 isArray 来确定是使用 rowObject["docid"] 还是 rowObject[integer]: jqGrid - rowObject inconsistencies?

于 2013-08-02T19:54:46.473 回答