用新数据重新加载 jqGrid

Reload jqGrid with new data

我有这个简单的功能

function createGrid(limit){
    $("#list").trigger("reloadGrid"); 
    $("#list").jqGrid({
        url:indexObj.gridUrl,
        postData:{
            "limit":limit
        },
        datatype: "json",
        colNames:['ID','type','folder','Description'],
        colModel:[
            {name:'id',index:'id', width:50},
            {name:'type',index:'type', width:100},
            {name:'folder_id',index:'folder_id', width:100},
            {name:'description',index:'description', width:200} 
        ]
    });
}

我首先用 limit = 1 调用它,然后它调用服务器和 returns 正确的数据。 然后我用 limit = 2 调用它,它只是重新运行之前的 ajax 调用(limit=1)和 returns 当然是相同的数据。

为什么 postData 实际上没有改变?我在 fireBug 中看到 "limit" 确实有正确的值。

我不确定具有这种数据缓存的构造是否良好,但是您当前的问题很清楚。

重要的是要了解调用

$("#list").jqGrid({
    url:indexObj.gridUrl,
    ...
});

创建网格。它在非常复杂的 div 和表格结构中转换空 <table id="list"></table>。所以一个人只能创建一次网格

网格由许多部分组成(如 headers),在下一次填充网格时不需要重新创建这些部分。所以jqGrid提供了reloadGrid事件可以触发重新填充网格的body。如果 jqGrid 有 postData 和一些像

这样的值
postData: {
    limit: limitVar
}

then if 意味着 postData 的 object 值将被创建并用 limitVar 变量的当前值 一次 初始化。如果你有 outer 变量(全局的,或者在一些外部范围内定义的)那么你可以使用

postData: {
    limit: function () { return limitVar; }
}

在这种情况下,您将limitVar 的当前 值作为URL 的limit 参数的值。顺便说一句,如果用户只是点击列 header,网格需要排序,jqGrid 将向 url 发出新的 HTTP 请求。如果您在 postData 中使用 function,那么在这些情况下,您也会得到 当前 limitVar

如果您希望对现有代码进行较少的修改,那么您可以将 $("#list").trigger("reloadGrid"); 行(当前代码中绝对不需要)替换为

$("#list").jqGrid("GridUnload");

它将破坏之前创建的潜水和表格结构(构建网格)并在同一位置创建一个空 <table id="list"></table>。所以你可以重新创建网格。此类代码的工作效率不高,但在某些情况下可能非常有用(例如,请参见 the answer and this one)。

或者在重新加载时,您可以使用 setGridParam 来重置 postData

$("#list").jqGrid('setGridParam', { 
        postData: {"limit":limit }
 }).trigger('reloadGrid'); 

而且,您不需要 reinitialize/create jqGrid,但您可以简单地使用:

function createGrid(limit){
    $("#list").trigger("reloadGrid"); 
    #Code Goes here#
}