误导jqgrid文档:客户端排序,但服务器端分页

时间:2013-05-16 21:06:15

标签: javascript jqgrid

这个问题已经多次回答了。但是我想在网站上说如果没有附加代码就无法实现文档中提供的代码,为什么它首先在那里被提供。它简直是误导。文档中给出的代码实现了分页,但在排序时,网格数据只是消失了。

如果我错了,请纠正我。

jQuery("#gridid").jqGrid({
...
datatype: 'json', // can be xml
loadComplete : function () {
   jQuery("#gridid").jqGrid('setGridParam',{datatype:'local'});
},
onPaging : function(which_button) {
   jQuery("#gridid").jqGrid('setGridParam',{datatype:'json'});
},
...
});

2 个答案:

答案 0 :(得分:1)

您没有在获得代码的文档中发布确切的引用。我找到了here

jqGrid是免费获得的开源产品。它很实用,但你应该明白,在这种情况下,产品及其文档可能并不完美。您引用的代码部分可能在某些非常旧版本的jqGrid中工作,但它在当前版本的jqGrid中是错误的代码。实现"客户端排序的意义,但服务器端分页"非常怀疑。关于你会找到here主题的旧答案。我现在会重写部分答案,但一般来说,使用旧版本测试的代码可能与新版本的jqGrid不完全兼容。

答案 1 :(得分:0)

我可以说没有故意误导的地方。尽管它是一个非常庞大的插件,但它们正在免费提供。像奥列格这样的人所做的工作正在使它变得更加完美。对于您的问题,这里与“客户端排序和服务器端分页”相关的代码是可以解决您的问题的代码。这是在Oleg给出的old answer的帮助下拍摄的。

这是我的代码版本,

  loadComplete: function(data) {

 var $this = $(this);
 if ($this.jqGrid('getGridParam', 'datatype') === 'json') {
 // because one use repeatitems: false option and uses no
 // jsonmap in the colModel the setting of data parameter
 // is very easy. We can set data parameter to data.rows:
    $this.jqGrid('setGridParam', {
      datatype: 'local',
      data: data.userdata,
      pageServer: data.page,
      recordsServer: data.records,
      lastpageServer: data.total
      });
// because we changed the value of the data parameter
// we need update internal _index parameter:
    this.refreshIndex();
      if ($this.jqGrid('getGridParam', 'sortname') !== '') {
// we need reload grid only if we use sortname parameter,
// but the server return unsorted data
    $this.triggerHandler('reloadGrid');
}
} else {
    $this.jqGrid('setGridParam', {
    page: $this.jqGrid('getGridParam', 'pageServer'),
    records: $this.jqGrid('getGridParam', 'recordsServer'),
    lastpage: $this.jqGrid('getGridParam', 'lastpageServer')
});
this.updatepager(false, true);}
}

onPaging:function(){
/*this code  is to fix the issue when we click on next page with some data in filter tool bar
     * along with this in grid definition( in filterToolbar ) we have to return true in "beforeClear "event 
     * */
    var data = $(this).jqGrid("getGridParam", "postData");
    data._search = false;
    data.filters=null;
    data.page=$(this).jqGrid("getGridParam","page");

    /* comment this line if you disable filter toolbar*/
    $(this)[0].clearToolbar();


    //Here making _search alone false will not solve problem, we have to make search also false. like in below.
    $(this).jqGrid('setGridParam', { search: false, postData:data });
    var data = $(this).jqGrid("getGridParam", "postData");


    /*this is to fix the issue when we go to last page(say there are only 3 records and page size is 5) and click 
     * on sorting the grid fetches previously loaded data (may be from its buffer) and displays 5 records  
     * where in i am expecting only 3 records to be sorted out.along with this there should be a modification in source code.
     */ 

    $(this).jqGrid("clearGridData");

    /* this is to make the grid to fetch data from server on page click*/

    $(this).setGridParam({datatype: 'json'}).triggerHandler("reloadGrid");   

}   

要在源代码中进行修改,请参阅this answer ..