1. 程式人生 > >bootstrap table實現server分頁序號連續(當前頁從上一頁的結束序號開始)

bootstrap table實現server分頁序號連續(當前頁從上一頁的結束序號開始)

前言

  • 在使用bootstrap table的時候難免會用到分頁,分頁它提供了兩種方式:client客戶端分頁、server服務端分頁兩種方式。
  • 在專案中一般是不用client分頁的,一般表格資料量大,用client分頁會導致快取爆炸,所以我們選擇server分頁。
  • 存在即合理,client也是可以用的(資料量特別少的時候),相對於server方式,它的分頁序號是自動連續的。而server方式分頁的序號就不連續的了(每一頁都是從1開始,而不是從上一頁的結束序號開始),本文就著重解決這個問題。

原始分頁結果

  • client分頁,使用bootstrap table的formatter中的index索引值可以使得序號是連續的,上圖:

這裡寫圖片描述

這是第1頁的序號,為1-4。

這裡寫圖片描述

這是第2頁的序號,為5-8。

  • server分頁,由於缺乏當前頁的位置pageNumber和每頁的大小pageSize,所以無法確定索引值,用formatter返回index就是隻有當前頁的索引。

這裡寫圖片描述

這是server分頁的第1頁,序號為1-4。

這裡寫圖片描述

這是server分頁的第5頁,序號也為1-4。

解決步驟

  • 出現這個問題的原因是什麼呢,由於我們使用的formatter返回的index引數,這個引數是表格的索引,client的所有n條總資料都在客戶端,index就為1-n,而server分頁每次伺服器只返回的是當前頁的資料到客戶端,所以index就只有1-pageSize,pageSize為一頁的資料量,所以就出現這個問題了。
  • 針對server伺服器只返回一頁的資料的原因導致每次翻頁的序號都從1開始的問題,那麼我們就需要把服務端和客戶端的頁面資料關聯起來,所以我們在原始的formatter的基礎上修改,讓它傳遞這個引數就ok了。
  • 首先我們看boostrap table的js原始碼,可以看到一些內部函式的寫法,如:
 BootstrapTable.prototype.showRow = function (params) {
        this.toggleRow(params, true);
    };
  • 那麼我們可以自己定義一個功能函式嗎?答案是肯定的,我們也照著寫一個返回我們需要的索引值的函式。定義如下:
 BootstrapTable.prototype.getPage = function (param) {
        return this.options.pageSize * this.options.pageNumber + 1;
    }
  • 我們能寫這個函式傳遞索引引數的原因是,pageSize和pageNumber本身就是bootstrap table的內部引數,全部都整合在options中,所以你有這個引數我才能寫函式返回這個值。
  • 寫好函式還得把這個函式寫進內部函式列表中,不然也用不了,如下把getIndex像它原來的函式那樣插入進去(第四行):
 var allowedMethods = [
        'getOptions',
        'getSelections', 'getAllSelections', 'getData', 'getIndex',
        'load', 'append', 'prepend', 'remove', 'removeAll',
        'insertRow', 'updateRow', 'updateCell', 'updateByUniqueId', 'removeByUniqueId',
        'getRowByUniqueId', 'showRow', 'hideRow', 'getHiddenRows',
        'mergeCells',
        'checkAll', 'uncheckAll', 'checkInvert',
        'check', 'uncheck',
        'checkBy', 'uncheckBy',
        'refresh',
        'resetView',
        'resetWidth',
        'destroy',
        'showLoading', 'hideLoading',
        'showColumn', 'hideColumn', 'getHiddenColumns', 'getVisibleColumns',
        'showAllColumns', 'hideAllColumns',
        'filterBy',
        'scrollTo',
        'getScrollPosition',
        'selectPage', 'prevPage', 'nextPage',
        'togglePagination',
        'toggleView',
        'refreshOptions',
        'resetSearch',
        'expandRow', 'collapseRow', 'expandAllRows', 'collapseAllRows',
        'updateFormatText'
    ];
  • 這樣我們就可以在表中使用,在formatter中使用了getIndex方法,實現了分頁序號的連續(editable: {…}是行編輯,請檢視我另一篇部落格):
$("tb_departments").bootstrapTable({
            method: 'post',                      //請求方式
            height: 500,
            toolbar: '#toolbar',                //工具按鈕用哪個容器
            striped: true,                      //是否顯示行間隔色
            cache: false,                       //是否使用快取,預設為true,所以一般情況下需要設定一下這個屬性(*)
            pagination: true,                   //是否顯示分頁
            sortable: true,                     //是否啟用排序
            sortOrder: "asc",                   //排序方式
            sidePagination: "server",           //分頁方式:client客戶端分頁,server服務端分頁
            pageNumber: 1,                       //初始化載入第一頁,預設第一頁
            pageSize: 4,                       //每頁的記錄行數(*)
            pageList: [4, 20, 25, 30],        //可供選擇的每頁的行數(*)
            //search: true,                       //是否顯示錶格搜尋,此搜尋是客戶端搜尋,不會進服務端,所以,個人感覺意義不大
            strictSearch: true,
            //showPaginationSwitch: true,
            showExport: true,
            exportDataType: "all",
            showExport: true,  //是否顯示匯出按鈕
            buttonsAlign:"right",  //按鈕位置
            exportTypes:[ 'csv', 'txt',  'excel', 'pdf'],  //匯出檔案型別
            Icons:'glyphicon-export',
            showColumns: true,                  //是否顯示所有的列
            showToggle:true,                    //是否顯示詳細檢視和列表檢視的切換按鈕
            showExportAll:true,                  //是否顯示全部匯出按鈕
            showRefresh: false,                  //是否顯示重新整理按鈕
            minimumCountColumns: 1,             //最少允許的列數
            clickToSelect: true,                //是否啟用點選選中行
            cardView: false,                    //是否顯示詳細檢視
            detailView: false,                   //是否顯示父子表
            showHeader: true,
            onEditableSave: function (field, row, oldValue, $el) {
                $.ajax({
                    success: function (data, status) {
                        if (status == "success") {
                            alert("編輯成功");
                        }
                    },
                    error: function () {
                        alert("Error");
                    },
                    complete: function () {

                    }
                });
            },
            columns: [
                {
                    title: '編號',//標題
                    formatter: function (value, row, index) {
                        return $("tb_departments").bootstrapTable("getIndex");
                    }
                },
                {
                    align: "left",//水平居中
                    halign: "left",//垂直居中
                    field: "vehplate",
                    title: "車牌號碼",
                    editable: {
                        type: 'text',
                        title: "車牌號碼",
                        noeditFormatter: function (value,row,index) {
                            var result={filed:"vehplate",value:value};
                            return result;
                        },
                        validate: function (value) {
                            if ($.trim(value) == '') {
                                return '車牌號碼不能為空!';
                            }
                        }
                    }
                },{
                    align: "left",
                    halign: "left",
                    field: "price",
                    sortable:true,
                    title: "原值(萬元)",
                    editable: {
                        type: 'text',
                        title: "原值(萬元)",
                        noeditFormatter: function (value,row,index) {
                            var result={filed:"price",value:value,class:"badge bg-green",style:"padding:5px 10px;"};
                            return result;
                        }
                    }
                },
                {
                    align: "left",
                    halign: "left",
                    field: "netvalue",
                    sortable:true,
                    title: "淨值(萬元)",
                    editable: {
                        type: 'text',
                        title: "淨值(萬元)",
                        noeditFormatter: function (value,row,index) {
                            var result={filed:"netvalue",value:value,class:"badge bg-orange",style:"padding:5px 10px;"};
                            return result;
                        }
                    }
                },
                {
                    align: "left",
                    halign: "left",
                    field: "accumulatedmileage",
                    sortable:true,
                    title: "累計里程",
                    editable: {
                        type: 'text',
                        title: "累計里程",
                        noeditFormatter: function (value,row,index) {
                            var result={filed:"accumulatedmileage",value:value};
                            return result;
                        }
                    }
                },
                {
                    align: "left",
                    halign: "left",
                    field: "accumulateddepreciation",
                    sortable:true,
                    title: "累計折舊(萬元)",
                    editable: {
                        type: 'text',
                        title: "累計折舊(萬元)",
                        noeditFormatter: function (value,row,index) {
                            var result={filed:"accumulateddepreciation",value:value};
                            return result;
                        }
                    }
                },
                {
                    align: "left",
                    halign: "left",
                    field: "vehClass",
                    title: "車型"
                },
                {
                    align: "left",
                    halign: "left",
                    field: "vehtype1Desc",
                    title: "車類"
                }, {
                    align: "left",
                    halign: "left",
                    field: "vehtype2Desc",
                    //width: 100,
                    title: "車類明細"
                }
            ],
            onPageChange:function(number, size)
            {
                //設定在分頁事件觸發時,傳遞分頁引數給後臺,重新載入資料
                me.queryBaseParam.limit=size;
                me.queryBaseParam.start=number;
                me.ajaxGetData();
            },
            onSort: function (name, order) {
                //傳遞引數給後臺進行排序
                me.queryBaseParam.sort=name;
                me.queryBaseParam.order=order;
                me.ajaxGetData();
            }
        });
  • 最後的結果和client分頁的序號是一樣的。有任何問題歡迎留言。

注:本文為原創,轉載請註明出處。