用新数据重新加载 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#
}
我有这个简单的功能
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#
}