一、什么是Bootstrap-table?
在業務系統開發中,對表格記錄的查詢、分頁、排序等處理是非常常見的,在Web開發中,可以采用很多功能強大的插件來滿足要求,且能極大的提高開發效率,本隨筆介紹這個bootstrap-table是一款非常有名的開源表格插件,在很多項目中廣泛的應用。Bootstrap-table插件提供了非常豐富的屬性設置,可以實現查詢、分頁、排序、復選框、設置顯示列、Card view視圖、主從表顯示、合並列、國際化處理等處理功能,而且該插件同時也提供了一些不錯的擴展功能,如移動行、移動列位置等一些特殊的功能,插件可以用基於HTML5的data-*屬性標識設置,也可以使用Javascript方式進行設置,非常方便。本篇隨筆介紹bootstrap-table插件在我實際項目中的應用情況,總結相關使用中碰到的問題處理經驗。
二、怎么使用Bootstrap-table?
Bootstrap-Table顯示數據到表格的方式有兩種,一種是客戶端(client)模式,一種是服務器(server)模式。
客戶端模式:指的是在服務器中把要顯示到表格的數據一次性加載出來,然后轉換成JSON格式傳到要顯示的界面中,客戶端模式較為簡單,它是把數據一次性加載出來放到界面上,然后根據你設置的每頁記錄數,自動生成分頁。當點擊第二頁時,會自動加載出數據,不會再向服務器發送請求。同時用戶可以使用其自帶的搜索功能,可以實現全數據搜索。對於數據量較少的時候,可以使用這個方法。
服務器模式:指的是根據設定的每頁記錄數和當前要顯示的頁碼,發送數據到服務器進行查詢,然后再顯示到表格中。該方法可以根據用戶的需要動態的加載數據,節省了服務器的資源,但是不能使用其自帶的全數據搜索功能。
Bootstrap-table是基於Boostrap開發的插件,因此使用的時候,需要引入Bootstrap的腳本和樣式。
如果我們項目中沒有引入相關的文件,則需要引入這些樣式和腳本文件,如下所示。
1 <link rel="stylesheet" href="bootstrap.min.css">
2 <script src="jquery.min.js"></script> 3 <script src="bootstrap.min.js"></script>
然后是Bootstrap-table的依賴引用:
CSS文件引入
1 <link rel="stylesheet" href="bootstrap-table.css">
腳本文件引入
1 <script src="bootstrap-table.js"></script>
2 <--漢化文件,放在 bootstrap-table.js 后面--> 3 <script src="bootstrap-table-zh-CN.js"></script>
bootstrap-table在頁面中的使用,可以分為兩種,一種是純粹用HTML5的寫法,通過data-*的方式指定各種屬性設置,一種是HTML+JS方式實現彈性設置。
如果我們采用HTML5標識的方式初始化HTML代碼,則是下面的代碼。
1 <table data-toggle="table" data-url="data1.json">
2 <thead> 3 <tr> 4 <th data-field="id">Item ID</th> 5 <th data-field="name">Item Name</th> 6 <th data-field="price">Item Price</th> 7 </tr> 8 </thead> 9 </table>
如果我們采用JS代碼方式來初始化表格插件,那么只需要在HTML上聲明一個表格對象即可,如下代碼。
1 <table id="table"></table>
js代碼如下:
1 $('#table').bootstrapTable({ 2 url: 'data1.json', 3 columns: [{ 4 field: 'id', 5 title: 'Item ID' 6 }, { 7 field: 'name', 8 title: 'Item Name' 9 }, { 10 field: 'price', 11 title: 'Item Price' 12 }, ] 13 });
不過實際上我們使用 bootstrap-table的JS配置功能肯定比這個復雜很多,下面界面效果是實際表的數據展示。
三、Bootstrap-table詳解:
1)整個JS屬性配置
以上圖為例,上圖展示結果的JS代碼如下所示:
1 var $table; 2 //初始化bootstrap-table的內容 3 function InitMainTable () { 4 //記錄頁面bootstrap-table全局變量$table,方便應用 5 var queryUrl = '/TestUser/FindWithPager?rnd=' + Math.random() 6 $table = $('#grid').bootstrapTable({ 7 url: queryUrl, //請求后台的URL(*) 8 method: 'GET', //請求方式(*) 9 //toolbar: '#toolbar', //工具按鈕用哪個容器 10 striped: true, //是否顯示行間隔色 11 cache: false, //是否使用緩存,默認為true,所以一般情況下需要設置一下這個屬性(*) 12 pagination: true, //是否顯示分頁(*) 13 sortable: true, //是否啟用排序 14 sortOrder: "asc", //排序方式 15 sidePagination: "server", //分頁方式:client客戶端分頁,server服務端分頁(*) 16 pageNumber: 1, //初始化加載第一頁,默認第一頁,並記錄 17 pageSize: rows, //每頁的記錄行數(*) 18 pageList: [10, 25, 50, 100], //可供選擇的每頁的行數(*) 19 search: false, //是否顯示表格搜索 20 strictSearch: true, 21 showColumns: true, //是否顯示所有的列(選擇顯示的列) 22 showRefresh: true, //是否顯示刷新按鈕 23 minimumCountColumns: 2, //最少允許的列數 24 clickToSelect: true, //是否啟用點擊選中行 25 //height: 500, //行高,如果沒有設置height屬性,表格自動根據記錄條數覺得表格高度 26 uniqueId: "ID", //每一行的唯一標識,一般為主鍵列 27 showToggle: true, //是否顯示詳細視圖和列表視圖的切換按鈕 28 cardView: false, //是否顯示詳細視圖 29 detailView: false, //是否顯示父子表 30 //得到查詢的參數 31 queryParams : function (params) { 32 //這里的鍵的名字和控制器的變量名必須一致,這邊改動,控制器也需要改成一樣的 33 var temp = { 34 rows: params.limit, //頁面大小 35 page: (params.offset / params.limit) + 1, //頁碼 36 sort: params.sort, //排序列名 37 sortOrder: params.order //排位命令(desc,asc) 38 }; 39 return temp; 40 }, 41 columns: [{ 42 checkbox: true, 43 visible: true //是否顯示復選框 44 }, { 45 field: 'Name', 46 title: '姓名', 47 sortable: true 48 }, { 49 field: 'Mobile', 50 title: '手機', 51 sortable: true 52 }, { 53 field: 'Email', 54 title: '郵箱', 55 sortable: true, 56 formatter: emailFormatter 57 }, { 58 field: 'Homepage', 59 title: '主頁', 60 formatter: linkFormatter 61 }, { 62 field: 'Hobby', 63 title: '興趣愛好' 64 }, { 65 field: 'Gender', 66 title: '性別', 67 sortable: true 68 }, { 69 field: 'Age', 70 title: '年齡' 71 }, { 72 field: 'BirthDate', 73 title: '出生日期', 74 formatter: dateFormatter 75 }, { 76 field: 'Height', 77 title: '身高' 78 }, { 79 field: 'Note', 80 title: '備注' 81 }, { 82 field:'ID', 83 title: '操作', 84 width: 120, 85 align: 'center', 86 valign: 'middle', 87 formatter: actionFormatter 88 }, ], 89 onLoadSuccess: function () { 90 }, 91 onLoadError: function () { 92 showTips("數據加載失敗!"); 93 }, 94 onDblClickRow: function (row, $element) { 95 var id = row.ID; 96 EditViewById(id, 'view'); 97 }, 98