jqGrid 后台分页 与 前端分页

先说后端分页,主要是利用sql语句查询时,用游标 offset , limit 来控制。
那么页面js请求,如何将这两个关键参数,映射到controller的modal中呢。

下面是参数映射的核心地方 , 注意 prmNames 这个参数,定义了 jsGrid 中的参数 映射到controller中modal 的参数名, pageNum和 limit是 我们modal中的 成员变量名,分别对应jqGrid 中的 page 和 rows。而modal 中 offset 可以通过 计算得来 ,比如 offset = (pageNum-1)*limit 。

prmNames : {
            page:"pageNum",  // 页码(第几页)
            rows:"limit",    //每页多少条数据
            order: "order"
        }

这样请求重要的参数就能顺利映射过去。
那么 controller中的 查询结果 怎么回到页面呢, 请看 jsonReader 这个参数,此参数定义了 返回对象的 格式,。
我们的数据应该长这样:
{"data":[{....}, {....}] ,
"currPage": 2 ,
"totalPage": 10,
"totalCount": 231
}
如何构建上面json结构的数据, 相比大家都会,就不废话了。

jsonReader : {
            root: "pager.data",        // 数据列表   
            page: "pager.currPage", // 当前第几页
            total: "pager.totalPage", // 总共多少页
            records: "pager.totalCount"  // 总记录数
 },

完整的js代码块如下:

$("#jqGrid").jqGrid({
        url : 'api/list',
        mtype: 'post',
        datatype : "json",
        colModel : [
            { label: '用户数', name: 'fa', width: 90, sortable: false},
            { label: '话单数量', name: 'dfCnt', width: 100, sortable: false, key: true},
            { label: '金额', name: 'sFee', width: 80, sortable: false,     
                                              formatter:function(value, options, row){
                return value ?  value.toFixed(2) : '-' ;
            }}
        ],
        viewrecords : true,
        height : 385,
        rowNum : 10,
        rowList : [ 10, 30, 50 ],
        rownumbers : false,
        rownumWidth : 25,
        autowidth : true,
        multiselect : false,
        pager: "#jqGridPager",
        footerrow:true, //加这个标识
        jsonReader : {
            root: "pager.list",
            userdata:"sumData",
            page: "pager.currPage",
            total: "pager.totalPage",
            records: "pager.totalCount"
        },
        prmNames : {
            page:"pageNum", 
            rows:"limit", 
            order: "order"
        }   
});

后端controller代码:

// controller 方法代码块,仅供参考
@PostMapping("/list")
@ResponseBody
public Response_2 list(CubeBill cubeBill)
{
        //查询记录总数
       Integer count = cubeBillService.countCubeBills(cubeBill);    
    //查询分页详情
        List list = cubeBillService.collectCubeBillPage(cubeBill);
        // 封装 data ,currPage,totalPage, totalCount 的模型对象
        PageVO pager = new PageVO(list, count, cubeBill.getLimit(), 
                                                               cubeBill.getPageNum());   
        Response_2 res = Response_2.getNew().success("pager", pager);
        res.put("sumData", sumCB);
        return res;
}

// 这里是定义的返回类型 Response_2的内容
public class Response_2 extends HashMap {

    private Response_2() { }
    
    public static Response_2 getNew(){
        return new Response_2();
    }
    
    public Response_2 success(String message) {
        this.put("status", "0");
        this.put("message", message);
        return this;
    }
    
    public Response_2 success(String key, Object value) {
        this.put(key, value);
        return this;
    }
    
    public Response_2 fail() {
        this.put("status", "1");
        this.put("message", "系统错误");
        return this;
    }
    
    public Response_2 fail(String message) {
        this.put("status", "1");
        this.put("message", message);
        return this;
    }
    
    public Response_2 fail(String key, Object value) {
        this.put("status", "1");
        this.put(key, value);
        return this;
    }
}

对 jqGrid 中的参数感兴趣的可以看这里
http://blog.mn886.net/jqGrid/ ,这里面有详细的初始化参数解释。

============================分割线====下面是前端分页==============
上面后端分页,适用于 查询的结果集比较大的情况, 对于单次查询耗时较长,且结果集不是特别大的,习惯用一次全部查出,前端分页。

可以貌似 jqGrid 对于这种情况,支持不是特别好,找了好久没找到解决办法,目前是这样解决的。
1.将datatype设置为 'local', datatype: 'local',
2.重写onPaging方法,这个方法是 翻页事件 触发函数。
3.将jsonReader改成localReader , 这一步,我单独抽成了一个方法

[图片上传中...(image.png-8d12f5-1544754871061-0)]

重写入下,:

 onPaging:function(pageBtn){ //翻页实现 

            var records = $("#jqGrid").getGridParam('records');//获取返回的记录数
            var page = $("#jqGrid").getGridParam('page');//获取返回的当前页
            var rowNum = $("#jqGrid").getGridParam('rowNum'); //获取显示配置记录数量
            var total = Math.ceil(records/rowNum); //$("#jqGrid").getGridParam('total');//获取总页数         
            if(pageBtn==="next" && page1){
                page = parseInt(page)-1;
            }
            if(pageBtn==="last"){
                page = total;
            }
            if(pageBtn==="first"){
                page = 1;
            }
            //这里的 loadLoalData( );是自定义的一个js方法。重复利用
            loadLocalData(page);
        }

loadLocalData()方法

function loadLocalData(page){// page参数,显示 第几页
    var rowNum = $("#jqGrid").getGridParam('rowNum'); //获取显示配置记录数量          
    var mydata = {};
              mydata.rows = vm.q.savedData;
          mydata.page = page;
          mydata.records = mydata.rows.length;
          mydata.total = Math.ceil(mydata.records/rowNum);

          if(!mydata.rows || mydata.rows.length ==0 ){
              $("#jqGrid").jqGrid("clearGridData");
          } 
            
         $("#jqGrid").jqGrid("setGridParam", {
            data: mydata.rows,
            localReader:{              
                rows:function(object){ return mydata.rows ;},
                page:function(object){ return mydata.page ;},
                total:function(object){ return mydata.total ;},
                records:function(object){ return mydata.records ;},
                    repeatitems : false 
                }
        }).trigger("reloadGrid");
}

完整 的 js 代码块大致这样,如下:

$("#jqGrid").jqGrid({
        datatype: 'local',
        colModel : [            
            { label: '用户数', name: 'fa', width: 90, sortable: false},
            { label: '话单数量', name: 'dfCnt', width: 100, sortable: false, key: true},
            { label: '金额', name: 'sFee', width: 80, sortable: false, formatter:function(value, options, row){
                return value ?  value.toFixed(2) : '-' ;
            }}
        ],
        viewrecords : true,
        height : 385,
        rowNum : 10,
        rowList : [ 10, 30, 50 ],       
        autowidth : true,       
        pager: "#jqGridPager",

        onPaging:function(pageBtn){ //翻页实现 
            console.log(pageBtn);
            var records = $("#jqGrid").getGridParam('records');//获取返回的记录数
            var page = $("#jqGrid").getGridParam('page');//获取返回的当前页
            var rowNum = $("#jqGrid").getGridParam('rowNum'); //获取显示配置记录数量
            var total = Math.ceil(records/rowNum); //$("#jqGrid").getGridParam('total');//获取总页数         
            if(pageBtn==="next" && page1){
                page = parseInt(page)-1;
            }
            if(pageBtn==="last"){
                page = total;
            }
            if(pageBtn==="first"){
                page = 1;
            }
            
            loadLocalData(page);
        }    
});

不知道是否表达清楚了,欢迎大家一起讨论jqGrid的用法。

你可能感兴趣的:(jqGrid 后台分页 与 前端分页)