Javascript 排序不使用jqGrid
我在获取jqGrid排序时遇到问题。我更愿意在客户机上进行排序,但我也愿意对数据库进行新的调用,以获得排序结果 我可以单击列标题,排序箭头可以改变方向,但是数据根本不会改变 我已经看过了,但是调用reloadGrid似乎没有帮助 我的整个网格如下所示:Javascript 排序不使用jqGrid,javascript,jquery,jqgrid,Javascript,Jquery,Jqgrid,我在获取jqGrid排序时遇到问题。我更愿意在客户机上进行排序,但我也愿意对数据库进行新的调用,以获得排序结果 我可以单击列标题,排序箭头可以改变方向,但是数据根本不会改变 我已经看过了,但是调用reloadGrid似乎没有帮助 我的整个网格如下所示: var x = $("#grid").jqGrid({ jsonReader: { root: "rows", repeatitems: false }, datatype: "json", height: 'auto',
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 } );
找到了一个解决方案,但不完全确定为什么会这样。也许有人能提供一个更好的答案
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'});
}
如果您从服务器加载未排序的数据,并且只想对本地数据进行一次排序,则不应放置
jQuery(“网格”).trigger(“reloadGrid”)代码>内部的loadComplete
。每次对本地数据进行排序或分页时也将调用回调loadComplete
。此外,最好调用jQuery(#grid”).trigger(“reloadGrid”)代码>设置超时的内部setTimeout
。在这种情况下,格栅的第一次完全加载将在重新加载之前完成
我没有测试,但我认为loadComplete
的正确代码可能是以下代码
loadComplete:函数(){
var$this=$(this);
if($this.jqGrid('getGridParam','datatype')='json'){
if($this.jqGrid('getGridParam','sortname')!=''){
//只有在使用sortname参数时才需要重新加载网格,
//但是服务器返回未排序的数据
setTimeout(函数(){
$this.triggerHandler('reloadGrid');
}, 50);
}
}
}
在这种情况下,reloadGrid
将仅在从服务器首次加载网格时调用一次。在下一次调用时,数据类型
选项的值将已经是“本地”
更新:是jqGrid的分支,我从2014年底开始开发jqGrid。它有许多新特性。可以使用选项forceClientSorting:true
在jqGrid中显示当前数据页之前,强制对客户端的数据进行排序和筛选。因此,只需添加forceClientSorting:true
选项并删除旧答案中描述的技巧。loadonce
仅适用于预定义的加载程序。如果将数据类型用作函数,则应在首次使用自定义函数加载网格后手动设置datatype:local
试着这样做:
datatype : function (){
$.ajax({
…
complete :function (…){
…
$("#mygrid").setGridParam({datatype:'local'});
}
})
},
谢谢这是有道理的。我最后只是在服务器上进行排序并绑定新数据,这很简单,对我来说效果很好。@MikeChristensen:不客气!服务器上几乎任何类型的实现都会像JavaScript中的排序一样快速。所以在服务器上排序是最好的方法。我同意,特别是因为我必须做的一些排序涉及多个键;因此,我必须弄清楚如何为jqGrid编写自定义比较函数——我确信这是可能的,但我决定现在采用更简单的方法。它不应该是$this.jqGrid('getGridParam','sortname'))=''
您实际检查的不等于。@Reddy:否。应该检查sortname
参数的值是否不是空字符串。因此,应该使用==
(或!==
)和“
或”
。当前代码触发器reloadGrid
仅当加载的数据需要排序时,因此仅当sortname
参数不是空字符串时。您应该对此进行改进,因为它可能会有帮助,但到目前为止还没有。