Javascript 排序不使用jqGrid

Javascript 排序不使用jqGrid,javascript,jquery,jqgrid,Javascript,Jquery,Jqgrid,我在获取jqGrid排序时遇到问题。我更愿意在客户机上进行排序,但我也愿意对数据库进行新的调用,以获得排序结果 我可以单击列标题,排序箭头可以改变方向,但是数据根本不会改变 我已经看过了,但是调用reloadGrid似乎没有帮助 我的整个网格如下所示: var x = $("#grid").jqGrid({ jsonReader: { root: "rows", repeatitems: false }, datatype: "json", height: 'auto',

我在获取jqGrid排序时遇到问题。我更愿意在客户机上进行排序,但我也愿意对数据库进行新的调用,以获得排序结果

我可以单击列标题,排序箭头可以改变方向,但是数据根本不会改变

我已经看过了,但是调用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 } );

找到了一个解决方案,但不完全确定为什么会这样。也许有人能提供一个更好的答案

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
参数不是空字符串时。您应该对此进行改进,因为它可能会有帮助,但到目前为止还没有。