我一直遇到让jqGrid排序的问题。我希望最好在客户端上进行这种排序,但我也愿意对数据库进行新的调用以获得排序结果。
我可以点击列标题,排序箭头会改变方向,但数据根本不会改变。
我查看了this question,但是调用reloadGrid似乎没什么帮助。
我的整个网格如下:
var x = $("#grid").jqGrid({
jsonReader: { root: "rows", repeatitems: false },
datatype: "json",
height: 'auto',
autowidth: true,
forceFit: true,
colNames:['ID','Name'],
colModel:[
{name:'id', key:true, index:'id', width:60, sorttype:"int", jsonmap:"id"},
{name:'name', index:'name', width:90, jsonmap: "name"}
],
caption: "Results",
loadonce: true,
sortable: true,
loadComplete: function() {
jQuery("#grid").trigger("reloadGrid"); // Call to fix client-side sorting
}
});
//This data comes from a web service call, hard coding in to test
var jsonData = [
{id: 1, name: 'Apple'},
{id: 2, name: 'Banana'},
{id: 3, name: 'Pear'},
{id: 4, name: 'Orange'}
];
x[0].addJSONData( { rows: jsonData } );
答案 0 :(得分:8)
如果您从服务器加载未分类的数据,并且只想对本地数据进行排序一次,则不应将jQuery("#grid").trigger("reloadGrid");
放在loadComplete
内。回调loadComplete
也将在每个本地数据的排序或分页上调用。此外,最好在jQuery("#grid").trigger("reloadGrid");
内拨打setTimeout
。如果网格的完整首次加载将在重新加载之前完成。
我没有测试过,但我认为loadComplete
的正确代码可能与以下内容有关
loadComplete: function () {
var $this = $(this);
if ($this.jqGrid('getGridParam', 'datatype') === 'json') {
if ($this.jqGrid('getGridParam', 'sortname') !== '') {
// we need reload grid only if we use sortname parameter,
// but the server return unsorted data
setTimeout(function () {
$this.triggerHandler('reloadGrid');
}, 50);
}
}
}
如果在从服务器第一次加载网格时仅调用reloadGrid
一次。在下次调用时,datatype
选项的值将为'local'
。
更新: Free jqGrid是jqGrid的分支,我从2014年底开始开发。它有许多新功能。在当前数据页面将显示在jqGrid中之前,可以使用选项forceClientSorting: true
强制在客户端上对数据进行排序和过滤。因此,可以添加forceClientSorting: true
选项并删除旧答案中描述的技巧。
答案 1 :(得分:1)
找到了一个解决方案,但并不完全确定为什么会这样。也许有人可以提供更好的答案。
var x = $("#grid").jqGrid({
jsonReader: { root: "rows", repeatitems: false },
datatype: "json",
height: 'auto',
autowidth: true,
forceFit: true,
colNames:['ID','Name'],
colModel:[
{name:'id', key:true, index:'id', width:60, sorttype:"int", jsonmap:"id"},
{name:'name', index:'name', width:90, jsonmap: "name"}
],
caption: "Results",
//Required for client side sorting
loadonce: true,
gridComplete: function(){
$("#grid").setGridParam({datatype: 'local'});
}
答案 2 :(得分:0)
loadonce
仅适用于预定义的加载器。如果使用数据类型作为函数,则应在首次使用自定义函数加载网格后手动设置datatype:local
。
尝试这样的事情:
datatype : function (){
$.ajax({
…
complete :function (…){
…
$("#mygrid").setGridParam({datatype:'local'});
}
})
},