1. 程式人生 > 實用技巧 >EasyUI + JQuary + datagride 表格的真實分頁與假分頁

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:'',width:100,align:'left',align:'left', halign:'center'">第一列</th> 17 <th data-options="field:'',width:120,align:'right', halign:'center'">第二列</th> 18 <th data-options="field:'me',width:100,align:'left', halign:'center'">第一列</th> 19 <th data-options="field:'',width:160,align:'left', halign:'center'">第一列</th> 20 <th data-options="field:'',width:120,align:'right', halign:'center'">第一列</th> 21 <th data-options="field:'',width:110,align:'right', halign:'center'">第一列</th> 22 <th data-options="field:'',width:120,align:'left', halign:'center'">第一列</th> 23 <th data-options="field:'',width:120,align:'left', halign:'center'">第一列</th> 24 <th data-options="field:'',width: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