zoukankan      html  css  js  c++  java
  • EasyUI + JQuary + datagride 表格的真实分页与假分页

    先明确一下两者的定义

    easyui 表格中的分页给提供了两种方式

    • 假分页 :datagride在请求数据时将所有的数据一次请求过来,只是在前端进行展示时给人一种虚假的分页功能展示,外观看起来没有区别这种情形只是针对于数据量较小时使用,数据量大时还是推荐使用真分页
    • 真分页:前后端都进行了分页,也就是分页请求数据,在请求时只请求当页的N行数据,点击下一页时再重新请求第二页的数据

    这里先上真实分页的代码,废话不多说了~

    1.Html 页面展示表格书写

    1. data-options中是表格的初始化选项的给定,
    2. pageSize:20在这里是表格默认的每个页面中要显示多少行数据
    3. fit:true,是让表格填满整个的页面,适用于内联样式表中
     1 <table id="quaryDg" class="easyui-datagrid" style=""
     2        data-options="pagination:true,
     3                          pageSize:20,
     4                          fitColumns:true,
     5                          checkOnSelect:false,
     6                          fit:true,
     7                           singleSelect:true,
     8                          striped:true,
     9                          rownumbers:true,
    10                          collapsible:false,
    11                          toolbar:'#tb',
    12                          ">
    13         <thead>
    14         <tr>
    15             <!--        <th data-options="field:'dep1',checkbox:true"></th>-->
    16             <th data-options="field:'',100,align:'left',align:'left', halign:'center'">第一列</th>
    17             <th data-options="field:'',120,align:'right', halign:'center'">第二列</th>
    18             <th data-options="field:'me',100,align:'left', halign:'center'">第一列</th>
    19             <th data-options="field:'',160,align:'left', halign:'center'">第一列</th>
    20             <th data-options="field:'',120,align:'right', halign:'center'">第一列</th>
    21             <th data-options="field:'',110,align:'right', halign:'center'">第一列</th>
    22             <th data-options="field:'',120,align:'left', halign:'center'">第一列</th>
    23             <th data-options="field:'',120,align:'left', halign:'center'">第一列</th>
    24             <th data-options="field:'',120,align:'left', halign:'center'">第一列</th>
    25 <tr>
    26         </thead>
    27     </table>

    2.接下来看重头戏,表格的真实分页加载及数据解析

    function loadData(value) {
        $("#quaryDg").datagrid({
                loader: function (param, success, error) {
                    var pageNumber = param.page;
                    var pageSize = param.rows;
                    var url = "http://www.baidu.com";
                    var param1 = {
                        pageNo: pageNumber,
                        pageSize: pageSize,
                        key: value,
                       //等其他请求参数
                    };
                    //查询需要载入的数据
                    $.ajax({
                        url: url,
                        type: "POST",
                        async: false,
                        contentType: 'application/json;charset=UTF-8',
                        data: JSON.stringify(param1),
                        dataType: "JSON",
                        timeout: 20000,
                        success: function (data) {
                       
                            var myData = data.data;
                            if (myData != null) {
                                reLodadDateGrid(myData);//解析数据到表格中
                            } else {
                                $('#quaryDg').datagrid('loadData', {total: 0, rows: []});
    
                            }
                            $("#quaryDg").datagrid("loaded");
                        },
                        error: function (data) {
    
                        }
                    });
    
                },
                onClickCell: function (index, field, value) {
                    var row = $('#quaryDg').datagrid('getRows')[index];//获取单元格所在行的所有的值
    ...
                }
    
    
            }
        )
    }

    对的,你没看错,上面就是用到的datagride中的两个参数方法实现的

      $("#quaryDg").datagrid({
                loader: function (param, success, error) {},
    onClickCell: function (index, field, value) {})
    其中loader方法是联网加载datagride数据使用,onClickCell是表格的单元格点击事件,这个是额外的功能了~
    现在只是联网把数据请求出来了,是一堆的json串数据,那么我们怎么才进行解析呢?其实很简单了,接着看~
    function reLodadDateGrid(myData) {
        var data = myData.list;
        var values = [];
        for (var i = 0; i < data.length; i++) {
            var a = {
                'sqfName': data[i].sqfName,
                'amountIncluding': data[i].amountIncluding,
                'isEgis': data[i].isEgis,
                'taxPaymentStatus': data[i].taxPaymentStatus,
                'isIssued': data[i].isIssued,
                'flowId': data[i].flowId,
                'invoiceTypeId': data[i].invoiceTypeId,
                'lssuingMethod': data[i].lssuingMethod
            };
            values.push(a);
        }
        $('#quaryDg').datagrid('loadData', {total: myData.total, rows: values});
    }

    上面的数据解析,前面的字段要和html中field属性值对应,也就是列的值,在这里相当于把表格数据从新进行了封装,各个列的顺序可以不一样但是键值对要一对一,也就是你要在每列的数据与每一列保持一致

     说了上面这么多,肯定有人会说,说好的datagride真分页呢?怎么给我讲起了数据解析,别急

    其实代码中已经做好了分页的处理~

    1. 在loader方法请求时,我使用了下面两个param值,这个是datagride自动帮我们获取的当前页码和每一个页面的行数,我们只要把她作为请求参数传递给后台,让后台的小哥哥处理后只给我们这些数据就行了~后台分页也有的对应的框架~
       var pageNumber = param.page;
                      var pageSize = param.rows;
    2. 像上面配置了之后,你会发现,表格下面的总数和页码都不能点击下一页,总数也不对~别急是因为你需要告诉datagride总的数据有多少,不能说请求10条数据就是10条了,而是我有100条,只是请求了10条展示了,点击下一页时才能请求其他的啊
    3. $('#quaryDg').datagrid('loadData', {total: myData.total, rows: values});
    4. 就是这个,数据解析时,告诉总数total: myData.total,json数据串中肯定要告诉我们总数有多少的,不然鬼知道总数据有多少啊~其中后面的才是我们封装好的对应的数据这样就能完美解析了
    5. easyui的真实分页根本不需要我们手动处理,别想的那么复杂了,看了那么多博客真的走了不少误区~

    一条完美的分割线

    下面就是假分页,确实很简单,easyui 给的Demo里copy过来就能用,就是在数据解析时给一个数据分页过滤器即可

    请参考官网

     1         function pagerFilter(data){
     2             if (typeof data.length == 'number' && typeof data.splice == 'function'){    // is array
     3                 data = {
     4                     total: data.length,
     5                     rows: data
     6                 }
     7             }
     8             var dg = $(this);
     9             var opts = dg.datagrid('options');
    10             var pager = dg.datagrid('getPager');
    11             pager.pagination({
    12                 onSelectPage:function(pageNum, pageSize){
    13                     opts.pageNumber = pageNum;
    14                     opts.pageSize = pageSize;
    15                     pager.pagination('refresh',{
    16                         pageNumber:pageNum,
    17                         pageSize:pageSize
    18                     });
    19                     dg.datagrid('loadData',data);
    20                 }
    21             });
    22             if (!data.originalRows){
    23                 data.originalRows = (data.rows);
    24             }
    25             var start = (opts.pageNumber-1)*parseInt(opts.pageSize);
    26             var end = start + parseInt(opts.pageSize);
    27             data.rows = (data.originalRows.slice(start, end));
    28             return data;
    29         }
    30         
    31         $(function(){
    32             $('#dg').datagrid({loadFilter:pagerFilter}).datagrid('loadData', getData());
    33         });

    分页过滤器代码来源:http://www.jeasyui.net/demo/502.html

  • 相关阅读:
    企业应用的互联网化(2010年2月)
    Flex的危局,还是HTML5的盛宴?
    在MBP上自由切换显卡
    Django的中文编码问题
    Jenkins+Maven+SVN快速搭建持续集成环境(转)
    解决 phpmyadmin #2002 无法登录 MySQL 服务器
    Spring框架中获得DataSource对象的方法(转)
    jetty 源代码地址
    eclipse中js文件报missing semicolon
    等额本息贷款月付款额的推导公式
  • 原文地址:https://www.cnblogs.com/fanfusuzi/p/13571000.html
Copyright © 2011-2022 走看看