无法使用 sorttype 函数对 jqGrid 列进行排序

Unable to sort jqGrid column with sorttype function

正在尝试使用自定义排序对网格进行排序。我正在构建带有动态列和数据的 jqgrid。除了对其中一列进行排序外,一切都很好。我正在使用 javax.json 构建 json 并且我正在使用 jqgrid 4.7.0。这里是网格代码:

var resultsGrid = $("#resultsGrid");
var url = "grid/GridDataController?action=runSearch&searchText="+getSearchText()+"&_ts"+$.now();
var csvUrl = "grid/GridDataController?action=downloadCsv&_ts"+$.now();
var gridPagerId="#resultsPager";

var drawSearchResultsGrid = function(colNames,colModel,data) {
    resultsGrid.disableSelection(); //disales highlioghting cells outside selection like ghosting.
    resultsGrid.jqGrid({
        url: url,
        datatype: 'jsonstring',
        loadonce: true,
        mtype: "GET",
        height: 300,
        width: 700,
        colNames: colNames,
        colModel: colModel,
        datastr : data,
        rowNum: 100000,
        sortname: "invid",
        sortorder: "asc",
        rownumbers: true,
        viewrecords: true,
        pager: gridPagerId, 
        pginput : false,
        pgbuttons : false,
        viewrecords : false,
        gridview: true,
        autoencode: true,
        onSelectRow : function(id) {
            logMessage("row selected ["+id+"]");
        },
        loadComplete: function(data) {
            logMessage("load completed");
        },
        ondblClickRow : function(rowid) {
            logMessage("Double clicked");
            $(escapeColon("#contentForm:viewPropertiesButton")).click();
        }
    }); 
    // Set navigator with search enabled.
    resultsGrid.jqGrid('navGrid',gridPagerId,{add:false,edit:false,del:false,search:false,refresh:false});

    // add custom button to export the data to excel
    resultsGrid.jqGrid('navButtonAdd',gridPagerId,{
           caption:"Export", 
           onClickButton : function () { 
               resultsGrid.jqGrid('excelExport',{"url":csvUrl});
           } 
    });
}; //end drawResultGrid function

//get grid config...
$.ajax({
   type: "GET",
   url: url,
   data: "",
   dataType: "json",
    success: function(response)
    {
       if (response.result == "0")
       {
           logMessage("Drawing results grid...");
            drawSearchResultsGrid(response.colNames,response.colModel,response.data);
            resizeGrid();
           logMessage("Results grid drawing done.");
       }
       else
       {
           logMessage("Error : " + response.message);
           alert(response.message);
       }
    },
    error: function(x, e)
    {
         alert(x.readyState + " "+ x.status +" "+ e.msg);   
    }
});

这是我的动态 colModel:

  {
    "result":"0",
    "message":"",
    "data":{
    "records":18,
    "total":1,
    "page":"1",
    "rows":[ ]
    },
    "colNames":[
    "IP Address/Cidr",
    "Name",
    "IP Decimal",
    "Cidr"
    ],
    "colModel":[
    {
      "name":"adressCidr",
      "width":50,
      "sortable":true,
      "hidden":false,
      "sorttype":"function (cellValue,rowObject) {    console.log('sorting by ['+rowObject.ipDecimal+']');    return parseInt(rowObject.ipDecimal,10);}"
    },
    {
      "name":"name",
      "width":50,
      "sortable":true,
      "hidden":false
    },
    {
      "name":"ipDecimal",
      "width":50,
      "sortable":true,
      "hidden":false,
      "sorttype":"int"
    },
    {
      "name":"cidr",
      "width":0,
      "sortable":false,
      "hidden":true
    }
]
  }

ipDecimal 是一个隐藏列,但我出于测试目的显示它。要求是第一列 'addressCidr' 是一个字符串列,但我想使用隐藏的 ipDecimal 列对其进行排序。该函数既不显示 console.log 消息也不正确排序。但是,如果我通过单击它的 header 将 ipDecimal 排序为 'int',它工作正常。我唯一能想到的是 sorttype 函数本身的双引号。如果您在这里看到任何其他问题,或者解决此案例的最佳方法是什么,请告诉我。这是我构建 json 函数的片段:

private JsonObjectBuilder createColumn(JsonBuilderFactory factory,
        String name,int width,boolean sortable,boolean hidden,boolean sorttype)
{
    JsonObjectBuilder column =this.createColumn(factory, name, width, sortable, hidden);
    StringBuilder fnBuilder = new StringBuilder("");

    //this is not generic but can easily be made one :(

    fnBuilder.append("function (cellValue,rowObject) {");
    fnBuilder.append("    console.log('sorting by ['+rowObject.ipDecimal+']');");
    fnBuilder.append("    return parseInt(rowObject.ipDecimal,10);");
    fnBuilder.append("}");

    column.add("sorttype", fnBuilder.toString()); // this works, not sure why above function does not work :(
    return column;
}

private JsonObjectBuilder createColumn(JsonBuilderFactory factory,
        String name,int width,boolean sortable,boolean hidden)
{
    JsonObjectBuilder column;
    column = factory.createObjectBuilder();
    column.add("name", name);
    column.add("width", width);
    column.add("sortable", sortable);
    column.add("hidden", hidden);
    return column;
}

我用来测试的数据是:

  IpAddressCidr ipDecimal
  5.1.0.0/24--83951616
  5.1.1.0/24--83951872
  5.1.2.0/24--83952128
  5.1.3.0/24--83952384
  5.1.4.0/24--83952640
  5.3.0.0/24--84082688
  5.9.2.0/24--84476416
  6.0.0.0/24--100663296
  6.0.1.0/24--100663552
  6.0.2.0/24--100663808
  6.0.3.0/24--100664064
  6.0.4.0/24--100664320
  6.0.5.0/24--100664576
  7.1.0.0/24--117506048
  7.1.1.0/24--117506304
  7.1.2.0/24--117506560
  7.1.3.0/24--117506816
  198.186.198.0/24--3334129152

但这是我看到的 IP 198.186.198.0 应该出现在顶部,因为它具有最高的 ipDecimal,但它被推到了底部。

添加更多测试信息。如果我删除封闭的双引号,排序工作正常,但不是。 以下作品:

 { name: "adressCidr", width:50, sortable: true,
            sorttype: function (cellValue,rowObject) {  console.log('sorting by ['+rowObject.ipDecimal+']');return parseInt(rowObject.ipDecimal,10);}},

以下没有:

            { name: "adressCidr", width:50, sortable: true,
            sorttype: "function (cellValue,rowObject) {  console.log('sorting by ['+rowObject.ipDecimal+']');return parseInt(rowObject.ipDecimal,10);}"},

问题的原因是 sorttype 的用法,您将其定义为字符串而不是函数:

{
    "name":"adressCidr",
    "width":50,
    "sortable":true,
    "hidden":false,
    "sorttype":"function (cellValue,rowObject) {    console.log('sorting by ['+rowObject.ipDecimal+']');    return parseInt(rowObject.ipDecimal,10);}"
}

您使用 jqGrid 4.7,其中包含我建议的新功能(参见 here)。所以你可以包含像

这样的代码
$.extend($.jgrid, {
    cmTemplate: {
        myIpAddress: {
            sorttype: function (cellValue, rowObject) {
                console.log('sorting by [' + rowObject.ipDecimal + ']');
                return parseInt(rowObject.ipDecimal, 10);
            },
            width: 50
        }
    }
});

现在可以把服务器返回的数据改成

{
    "name":"adressCidr",
    "sortable":true,
    "hidden":false,
    "template":"myIpAddress"
}