尝试在本地对jqGrid进行排序仍然调用服务器端排序功能

问题描述 投票:0回答:1

我有一个 jqGrid,其中填充了来自服务器的数据,如下所示:

$("#dataGrid").jqGrid({
        url: 'url/load.json',
        datatype: 'json',
        mtype: 'POST',
        ...

从服务器提取初始数据后,将创建并添加此网格中的一列。我试图对此列进行排序,但由于它不存在于数据库中,jqGrid 的默认排序失败,导致 SQL 错误。它尝试从服务器重新加载网格,并按不存在的列排序。

为了解决这个问题,我尝试在单击该特定列时在本地进行排序。 然而,无论我尝试什么,初始 URL 'load.json' 仍然被调用,导致上面提到的 SQL 错误。也许我没有做正确的事情?

在 loadComplete() 函数中我有以下内容:

$("#dataGrid_ColumnToSortLocally").on('click', function()
{
    var grid = $("#dataGrid");
    var postData = grid.jqGrid('getGridParam', 'postData');
    var sortName = postData.sidx;
    var sortOrder = postData.sord || 'asc';
    if (sortName === 'ColumnToSortLocally') 
    {
        var gridData = grid.jqGrid('getRowData');
        gridData.sort(function(a, b) 
        {
            return sortOrder === 'asc' ? a.ColumnToSortLocally - b.ColumnToSortLocally: b.ColumnToSortLocally - a.ColumnToSortLocally;
        });

        try
        {
            grid[0].p.datatype = 'local';
            grid[0].p.url = null;
            grid[0].p.data = gridData;
            grid[0].p.records = gridData.length;
            grid[0].p.page = 1;
            $('#dataGrid').jqGrid('clearGridData').jqGrid('setGridParam',{data: gridData}).trigger("reloadGrid");
         }
         catch (error)
         {
             console.error('An error occurred:', error);
         }
         
         grid.jqGrid('setGridParam', {datatype:'json'});
     }
});

一切似乎都工作正常,直到我触发网格上的重新加载。我的数据存在并且已正确排序,但是当我尝试使用已排序的数据在本地重新加载网格时,它仍然回调到服务器以按不存在的列进行排序。

如何在本地按这一特定列进行排序,同时仍保留服务器对其他列进行排序?

如有必要,我可以包含任何其他相关的代码片段。

感谢您的帮助!

javascript jquery ajax sorting jqgrid
1个回答
0
投票

这个解决方案对我有用(经过测试)

$("#dataGrid").jqGrid({
    url: 'url/load.json',
    datatype: 'json',
    mtype: 'POST',
    ...
    onSortCol : function(name, index, order) {
        if(name === "ColumnToSortLocally") {
            this.p.datatype = 'local';
            this.p.data = $(this).jqGrid('getRowData');
        }
        return true;
    },
    loadComplete : function() {
        this.p.datatype = "json"
    }               
});
© www.soinside.com 2019 - 2024. All rights reserved.