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<CubeBill> 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<String, Object> {

    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" && page<total){
                page = parseInt(page)+1;
            }
            if(pageBtn==="prev" && page>1){
                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" && page<total){
                page = parseInt(page)+1;
            }
            if(pageBtn==="prev" && page>1){
                page = parseInt(page)-1;
            }
            if(pageBtn==="last"){
                page = total;
            }
            if(pageBtn==="first"){
                page = 1;
            }
            
            loadLocalData(page);
        }    
});

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

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 215,723评论 6 498
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 92,003评论 3 391
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 161,512评论 0 351
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 57,825评论 1 290
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 66,874评论 6 388
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 50,841评论 1 295
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,812评论 3 416
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 38,582评论 0 271
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 45,033评论 1 308
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,309评论 2 331
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,450评论 1 345
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,158评论 5 341
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,789评论 3 325
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,409评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,609评论 1 268
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 47,440评论 2 368
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,357评论 2 352

推荐阅读更多精彩内容

  • 在Mybatis配置xml中配置拦截器插件: 这里的com.github.pagehelper.PageHelpe...
    bboymonk阅读 3,465评论 6 2
  • Mybatis分页插件-PageHepler的使用 使用方法 1. 引入分页插件 引入分页插件一共有下面2种方式,...
    匆匆岁月阅读 1,423评论 0 7
  • 在实际的项目开发中,常常需要使用到分页,分页方式分为两种:前端分页和后端分页。 前端分页一次ajax请求数据的所有...
    意识流丶阅读 70,097评论 2 70
  • 不解释!直接贴安装代码 在同一目录下放置3个文件Dockerfile,start.sh,default Docke...
    amazing_bing阅读 372评论 0 2
  • 作为一个地道的农民,对大地有着独有的情感!时常想起那一袋面的故事,轻轻的打开记忆的时空,往事如风,往事如烟...
    点滴书写意阅读 378评论 2 6