这是我之前在here上提出的问题的后续。多亏了奥列格的回答,我现在可以正确地显示我的网格了。但是,现在我需要在引导程序菜单项上使用不同的URL刷新jqgrid中的数据。以下是我的代码:
$("#menuitem").click(function(e){
$("#grid").jqGrid('setGridParam', {url: '/getdata?id=1234&name=val.text'});
$('#grid').trigger("reloadGrid");
});
菜单选项是在我们从ajax请求中获得数据后动态添加的。当重新加载被触发时,网格似乎正在重新加载。但是,它似乎从旧的URL('/getdata')获取数据,而不是从具有不同参数集的新URL获取数据。我也尝试了here提到的解决方案,但它在我的情况下不起作用,因为我动态添加了菜单项。
任何帮助都是非常感谢的。
编辑:我查看了firebug上的页面请求。当我单击菜单项时,我看不到任何请求。我还添加了
$("#list").jqGrid('GridUnload');
添加到this问题答案中提到的单击处理程序函数。它为我清除了网格,但没有重新加载。所以我在这里添加了jqgrid的代码,然后它就可以工作了,jqgrid会显示新的数据。因此,我的更改代码如下所示:
$("#menuitem").click(function(e){
$("#list").jqGrid('GridUnload');
$("#grid").jqGrid({
url: '/getdata?id=1234&name=val.text'',
datatype: "json",
colNames: ['data'],
colModel: [
{name: 'data', align: 'center'}
],
jsonReader: {
root: "logs",
cell: "",
id: function () {
return function () {
return $.jgrid.randId();
}
},
page: function() { return 1; },
total: function() { return 1; },
records: function(obj) { return obj.logs.length; }
},
loadonce: true,
viewrecords: true,
autowidth: true,
ignoreCase: true,
height: "auto",
rowNum: 999,
autoencode: true,
beforeProcessing: function (data) {
var items = data.data.data.split("\n"), i, l, item;
data.logs = [];
for (i = 0, l = items.length; i < l; i++) {
item = $.trim(items[i]);
if (item.length > 0) {
data.logs.push([item]);
}
}
}
}).jqGrid('filterToolbar', {stringResult: true, searchOnEnter: false, defaultSearch: "cn"});
});
有没有更好的方法来做到这一点。对于它所做的事情来说,它看起来太笨重了。有没有办法让重新加载的网格正常工作?我猜这就是在内部发生的事情,但当你使用插件时似乎代码太多了。
谢谢,
阿莎
发布于 2013-01-11 17:17:45
首先,您需要修复代码中的语法错误(如果错误不仅仅存在于问题的文本中):
url: '/getdata?id=1234&name=val.text'',
必须替换为
url: '/getdata?id=1234&name=val.text',
您存在的主要问题是因为您使用loadonce: true
,如果您不想或不能在服务器端实现数据的分页和过滤,而您希望jqGrid为您做这件事,那么这是非常实用的。您应该了解,在使用"local"
的情况下,jqGrid会将原始datatype
从"json"
更改为"local"
。仅由于这些更改,所有后续刷新网格内容的请求(分页、过滤、排序...)将在本地实现,而不需要向服务器发出任何请求。如果需要重新加载网格,则需要在重新加载网格之前将datatype
的值重置为"json"
。在以下情况下不需要使用GridUnload
:
$("#grid").jqGrid('setGridParam', {
url: '/getdata?id=1234&name=val.text',
datatype: "json"
}).trigger("reloadGrid");
顺便说一句,你只需要设置url
参数,如果你需要改变它。如果你只想用之前相同的网址重新加载内容,你只需要重置datatype: "json"
即可。
发布于 2013-01-11 13:07:48
尝尝这个
变化
loadonce: true,
至
loadonce: false,
我认为加载一次是问题所在。
https://stackoverflow.com/questions/14269074
复制相似问题