1. 程式人生 > >bootstrap-table使用總結

bootstrap-table使用總結

1、下載:

https://github.com/wenzhixin/bootstrap-table

2、文件:

http://bootstrap-table.wenzhixin.net.cn/zh-cn/documentation/

3、引用:

<link rel="stylesheet" href="bootstrap.min.css">
<link rel="stylesheet" href="bootstrap-table.css">

<script src="jquery.min.js"></script>
<script src="bootstrap.min.js"></script>
<script src="bootstrap-table.js"></script>
<script src="bootstrap-table-zh-CN.js"></script>

注意:最後一個是一些提醒文字,如果有引用這個js則會以中文提示,如果沒有則以英文提示。

4、基本用法:

html裡:

<table id="table"></table>

js裡:
        $('#table').bootstrapTable({
            columns: [{
                field: 'id',
                title: 'Item ID'
            }, {
                field: 'name',
                title: 'Item Name'
            }, {
                field: 'price',
                title: 'Item Price'
            }],
            data: [{
                id: 1,
                name: 'Item 1',
                price: '$1'
            }, {
                id: 2,
                name: 'Item 2',
                price: '$2'
            }]
        });

這個data也可以換成url:
$('#table').bootstrapTable({
    url: 'data1.json',
    columns: [{
        field: 'id',
        title: 'Item ID'
    }, {
        field: 'name',
        title: 'Item Name'
    }, {
        field: 'price',
        title: 'Item Price'
    }, ]
});

注意:url和data的區別是:url是非同步請求遠端資料;data是直接把資料賦值給他。在主表和子表都一樣可以這樣使用。

5、引入fonts:

一些圖示需要用到bootstrap裡面的檔案,要從下載的bootstrap包裡面拷貝過來放到對應的目錄(看錯誤提醒)。

但是隻放進去是訪問不了的,因為他不是普通的檔案,所以要設定。

進入iis管理器,找到“MIME型別”,雙擊進去,在右邊選單點選“新增”,分別新增以下型別:

.woff
application/x-font-woff

.woff2          
application/x-font-woff

再重新整理頁面就可以載入fonts裡面這些檔案了。

6、定製元件

(function () {
    function init(table,url,params,titles,hasCheckbox,toolbar) {
        $(table).bootstrapTable({
            url: url,                           //請求後臺的URL(*)
            method: 'post',                     //請求方式(*)
            toolbar: toolbar,                   //工具按鈕用哪個容器
            striped: true,                      //是否顯示行間隔色
            cache: false,                       //是否使用快取,預設為true,所以一般情況下需要設定一下這個屬性(*)
            pagination: true,                   //是否顯示分頁(*)
            sortable: false,                    //是否啟用排序
            sortOrder: "asc",                   //排序方式
            queryParams: queryParams,           //傳遞引數(*),這裡應該返回一個object,即形如{param1:val1,param2:val2}
            sidePagination: "server",           //分頁方式:client客戶端分頁,server服務端分頁(*)
            pageNumber:1,                       //初始化載入第一頁,預設第一頁
            pageSize: 20,                       //每頁的記錄行數(*)
            pageList: [20, 50, 100],            //可供選擇的每頁的行數(*)
            search: true,                       //是否顯示錶格搜尋,此搜尋是客戶端搜尋,不會進服務端,所以,個人感覺意義不大
            strictSearch: true,
            showColumns: true,                  //是否顯示所有的列
            showRefresh: true,                  //是否顯示重新整理按鈕
            minimumCountColumns: 2,             //最少允許的列數
            clickToSelect: true,                //是否啟用點選選中行
            //height: 500,                      //行高,如果沒有設定height屬性,表格自動根據記錄條數覺得表格高度
            uniqueId: "ID",                     //每一行的唯一標識,一般為主鍵列
            showToggle:true,                    //是否顯示詳細檢視和列表檢視的切換按鈕
            cardView: false,                    //是否顯示詳細檢視
            detailView: false,                  //是否顯示父子表

            columns: createCols(params,titles,hasCheckbox),
            data: [{
                id: 1,
                name: 'Item 1',
                price: '$1'
            }, {
                id: 2,
                name: 'Item 2',
                price: '$2'
            }]
        });
    }
    function createCols(params,titles,hasCheckbox) {
        if(params.length!=titles.length)
            return null;
        var arr = [];
        if(hasCheckbox)
        {
            var objc = {};
            objc.checkbox = true;
            arr.push(objc);
        }
        for(var i = 0;i<params.length;i++)
        {
            var obj = {};
            obj.field = params[i];
            obj.title = titles[i];
            arr.push(obj);
        }
        return arr;
    }
    //可傳送給服務端的引數:limit->pageSize,offset->pageNumber,search->searchText,sort->sortName(欄位),order->sortOrder('asc'或'desc')
    function queryParams(params) {
        return {   //這裡的鍵的名字和控制器的變數名必須一直,這邊改動,控制器也需要改成一樣的
            limit: params.limit,   //頁面大小
            offset: params.offset  //頁碼
            //name: $("#txt_name").val()//關鍵字查詢
        };
    }
    // 傳'#table'
    createBootstrapTable = function (table,url,params,titles,hasCheckbox,toolbar) {
        init(table,url,params,titles,hasCheckbox,toolbar);
    }

})();

1、呼叫:
createBootstrapTable('#table','',['id','name','price'],['Item ID','Item Name!','Item Price!'],true,'#toolbar');
2、模組:

注意,這些只要新增上一行程式碼就會自動顯示的:

pagination 顯示分頁
search     搜尋功能
showColumns  控制顯示哪些列的按鈕
showRefresh  重新整理按鈕
showToggle   詳細檢視和列表檢視切換按鈕

但是這個不會:
toolbar

這個toolbar會關聯到我們填的一個元素,但是他並不會自動建立所有選單,而是我們要建立好選單,他只不過把這個選單放到合適的位置,實現這些選單的功能還需要我們自己去做。toolbar如下:
    <div id="toolbar" class="btn-group">
        <button id="btn_add" type="button" class="btn btn-default">
            <span class="glyphicon glyphicon-plus" aria-hidden="true"></span>新增
        </button>
        <button id="btn_edit" type="button" class="btn btn-default">
            <span class="glyphicon glyphicon-pencil" aria-hidden="true"></span>修改
        </button>
        <button id="btn_delete" type="button" class="btn btn-default">
            <span class="glyphicon glyphicon-remove" aria-hidden="true"></span>刪除
        </button>
    </div>

3、sidePagination

這個是選擇服務端或者客戶端分頁,客戶端則填'client',服務端則填'server',他們的資料結構是不同的。

這是客戶端分頁的資料結構:

[
    {
        "id": 0,
        "name": "Item 0",
        "price": "$0"
    },
    {
        "id": 1,
        "name": "Item 1",
        "price": "$1"
    },
    {
        "id": 2,
        "name": "Item 2",
        "price": "$2"
    }
]

這是服務端分頁的資料結構:
{
    "total": 200,
    "rows": [
        {
            "id": 0,
            "name": "Item 0",
            "price": "$0"
        },
        {
            "id": 1,
            "name": "Item 1",
            "price": "$1"
        },
        {
            "id": 2,
            "name": "Item 2",
            "price": "$2"
        }
    ]
}

這是因為客戶端來分頁的話,他直接根據資料總量進行判斷要分成多少頁,而服務端的話就需要返回一個total給他,因為服務端返回給的資料是一個片段,他沒辦法根據這個片段來計算多少頁。

注意:這裡可以看到,服務端分頁和客戶端分頁資料結構的層次是不同的。他接受哪種資料結構,取決於是否加這個引數:

sidePagination:'server'
特別是做子表的時候,因為覺得沒有做分頁的必要,就沒了這句話,結果就是資料過去了死活不顯示,排查很久才發現是這個問題。
4、引數上傳

我們知道,當我們對table設定一個url的時候,他不僅是請求這個url,他還會帶一些引數上來,他到底帶來了什麼引數?

我們來一個最簡單的測試一下:

        $('#table').bootstrapTable({
            striped: true,
            pagination:true,
            sidePagination:'server',
            url:'/xx/yy',
            columns: [{
                field: 'id',
                title: 'Item ID'
            }, {
                field: 'name',
                title: 'Item Name'
            }, {
                field: 'price',
                title: 'Item Price'
            }]
        });

這裡我們簡單的初始化了一個bootstrap-table,資料來源我們指定了url,有個引數叫method,預設是'get',也可以設為'post',如果實際上線最好設為'post',但是這裡我們就用預設的好了,可以直接在瀏覽器的控制檯看到他請求的引數。


我們可以看到帶了一些引數上來

(1)order=asc表示排序是升序排序,這個我們可以在引數裡面設定:sortOrder: "asc/desc"(兩種選一種)

(2)offset=0表示從資料從哪個row開始,簡單的說從第幾行資料開始

(3)limit=10表示選取多少個數據,也就是一頁有多少條資料

2,3跟引數pageNumber和pageSize是緊密關聯的。

pageSize對應的就是limit,因此改變pageSize就改變了limit;

pageNumber結合pageSize可以算出offset。

比如pageNumber=1,pageSize=30,那麼offset=0,limit=30;

比如pageNumber=2,pageSize=30,那麼offset=30,limit=30。

他不傳第幾頁上來,而是傳從第幾行開始,選取多少行,這樣一個數據。

注意:pageNumber從1開始而非從0開始,但是offset是從0開始的。

如果我嘗試設定pageNumber:0,pageSize:30我們會發現offset=-30,limit=30,這是不對的。

5、引數的檢視、修改

那麼我們可以直接檢視這些引數以及修改嗎?答案是可以的。

有個原始引數就是用來配置這個:

queryParams:testQParams

建立函式:
function testQParams(params) {
            alert('params.limit='+params.limit+' params.offset='+params.offset);//我們可以這樣檢視這些要上傳的引數
        }

我們當然可以修改或者新增引數:
        function testQParams(params) {
            return {
                limit:params.limit,
                offset:params.offset,
                order:params.order,
                abc:123,
                def:456
            }
        }

有幾點要注意:

1、我們當然可以修改limit、offset這些引數,但是不建議在這裡改,我們可以用上面這種方式還給他賦值;

2、雖然沒有改動他,我們也不要丟了,如果在這裡沒寫引數就丟了,傳遞的引數會以這裡的為準;

3、我們可以增加新的引數。


7、顯示圖片

欄位通常是一個地址,那麼我們要顯示圖片應該使用formatter:

{
                field: 'thumb_img',
                title: '主圖',
                align: 'center',
                formatter:function (value,row,index) {
                    return '<img  src='+value+' width=50 class="img-rounded" >';
                }
            }

可以直接定義寬度,圖片會自動進行縮放。

8、行內編輯功能

<1>bootstrap-editable

需要一個bootstrap外掛叫做bootstrap-editable,現在改名叫做x-editable了,可以適用不同的框架。

地址:https://github.com/vitalets/x-editable

下載下來之後,找到dist/bootstrap3-editable裡面的3個資料夾css,js,img都拷貝到我們的網站目錄下。

<2>bootstrap-table-editable

這是一個bootstrap-table的外掛(外掛的外掛),這個外掛呢就在我們下載的bootstrap-table包裡,路徑是dist/extensions/editable

把他拷到我們的對應目錄下即可

<3>引入
<link href="<?php echo '/static/bootstrap/extensions/editable/css/bootstrap-editable.css'; ?>" rel="stylesheet">
<script src="<?php echo '/static/bootstrap/extensions/editable/js/bootstrap-editable.js'; ?>"></script>
<script src="<?php echo '/static/bootstrap-table/extensions/editable/bootstrap-table-editable.js'; ?>"></script>

注意他們跟jquery、bootstrap、bootstrap-table的依賴關係,所以要放在他們的後面。
<4>使用1:

在列定義裡面加上editable:true,比如:

                field:'addr',
                title:'地址',
                editable:true,

就會變成可編輯狀態了
<5>使用2:

編輯完成我們要新增一個回撥

在bootstrapTable頂級的屬性定義裡面,新增一個回撥函式:

            onEditableSave:function (field,row,oldValue,$el) {
                //alert('儲存addr='+row.addr+' id='+row.itemid);
            }

這裡我們可以看到當編輯完儲存的時候就會呼叫到這個函式,在row裡面有所有當前行的資訊,那麼我們可以通過把這個資訊用ajax傳遞到伺服器儲存起來。

編輯功能完成。

<6>儲存驗證+ajax儲存確認+取消儲存

我們在實際開發當中,經常需要這樣的功能:

(1)驗證使用者的輸入是否正確;

(2)如果使用者輸入不正確,就不要在頁面上顯示了,直接顯示儲存不了;

(3)如果使用者輸入正確,通過ajax請求儲存到後臺;

(4)如果儲存到後臺失敗,應該返回前端失敗的訊息,前端的內容回退到儲存前的狀態;

(5)如果儲存成功,前端也做相應的顯示樣式調整及狀態確定。

在上面“使用1”及“使用2”當中,當點選儲存的時候,在save函式裡驗證不起作用,你再驗證他也儲存進去了。所以驗證另有地方。

應該這樣做:

(1)把editable:true改為:
                    validate:function (value) {
                        value = $.trim(value);
                        if (!value)
                        {
                            return '必須填入一個網址,不能放空!';
                        }
                        if (!checkUrl(value))
                        {
                            return '輸入的不是一個合法的網址!';
                        }

                    }

另外,在這個函式裡,要取的row資料可以這樣:
                        var data = $('#table').bootstrapTable('getData');
                        var index = $(this).parents('tr').data('index');
                        console.log(data[index]);

這是因為這個$(this)可以指向這個當前單元格

這樣輸入就有驗證功能,return一個字串他會自動不儲存進去,而顯示這個字串的提示。

注意,驗證的儲存規則:

如果return '';  則會儲存空字串;

如果return 'xxx';  則不會儲存這個字串,而是作為提示顯示出來;

如果不return,則按照原value儲存。

(2)把onEditableSave改為:
                onEditableSave:function (field,row,oldValue,$el) {
                    // 測試證明oldValue取到的是undefined
                    $.post('xxx/yyy')
                        .done(function (result) {
                            //在這裡解析result
                            if(儲存成功)
                            {
                                // 頁面提示儲存成功
                            }else
                            {
                                // 頁面提示儲存失敗
                                // buy_addr_bak這個欄位是從服務端傳過來與buy_addr等值的一個欄位,就是為了在必要的時候恢復資料
                                $el.text(row.buy_addr_bak);
                            }
                            // 不管儲存成功還是失敗,已經不是編輯狀態,把加粗去掉
                            $el.removeClass('editable-unsaved');
                        });
                }

另外,在這個函式裡,如果要取到row資料可以這樣(雖然這裡沒有必要,引數裡已經有了):
                var data = $('#table').bootstrapTable('getData');
                var index = $el.parent().parents('tr').data('index');//注意這裡一個是parent,一個是parents
                console.log(data[index]);

9、自動換行

在給table加上樣式:

style="word-break:break-all; word-wrap:break-all;"

10、父子表

功能:點選行首的加號,下拉展開一個子表

<1>在父表的屬性裡新增

detailView:true

<2>添加回調函式
                onExpandRow:function (index,row,$detail) {
                    initSubTable(index,row,$detail);
                }

當點選行首的加號,將會觸發這個回撥函式,這個回撥函式會再去呼叫執行函式。

<3>執行函式

        function initSubTable(index,row,$detail) {
            var parentid = row.MENU_ID;
            var cur_table = $detail.html('<table></table>').find('table');//注意這個'table'不是一個id,他在任何情況下不需要改變
            $(cur_table).bootstrapTable({
                url:'',
                method:'post',
                queryParams:{strParentID:parentid},
                ajaxOptions:{strParentID:parentid},
                clickToSelect:true,
                detailView:true,
                uniqueId:"MENU_ID",
                pageSize:10,
                pageList:[10,25],
                columns:[
                    {
                        filed:'from',
                        title:'from'
                    },
                    {
                        field:'url',
                        title:'url'
                    },
                    {
                        field:'to',
                        title:'to'
                    }
                ],
                onExpandRow:function (index,row,$Subdetail) {
                    initSubTable(index,row,$Subdetail);
                }
            });
        }

注意,這裡做了一個遞迴,即子表裡面還可以展開孫表,我們也可以不需要,去掉就可以了。

11、重新整理功能

$('#table_search').bootstrapTable(
                    "refresh",
                    {
                        url:"/japp/autobuy/ajaxorder/search"
                    }
                );


參考文章:

http://www.cnblogs.com/landeanfen/p/4976838.html