bootstrap table使用小記


bootstrap table是一個非常不錯的,基於bootstrap的插件,它擴展和豐富了bootstrap表格的操作,如格式化表格,表格選擇器,表格工具欄,分頁等等。

最近基於bootstrap開發一個開台發布系統,就開發過程中,使用bootstap table遇到的一些問題及收獲記錄如下:

開始使用:

需要在你自己的頁面中引入以下樣式及腳本:

<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>

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

一、Bootstrap table 支持超多列,會自動顯示水平滾動條。

我們用bootstrap開發,經常會遇到一個頭疼的問題,如果客戶要求表格中顯示的列較多,無論我們用bootstrap的哪種布局方式,顯示效果都不盡人意。Bootstap table很好的協處理了這個問題,使我們能夠在不改變原有的布局方式的情況下,很好的處理超多列的問題,而且支持自定義顯示列名,效果如下:

使用方式很簡單,在一個普通的表格中設置data-toggle="table",就可以在不寫JavaScript的情況下啟用Bootstrap Table。當然還可以通過腳本的方式觸發:

$('#table').bootstrapTable({
    url: 'data.json'
});。
是不是很好使呢,只在我們指定的表格中會帶入Bootstrap Table的樣式,其它未指定的,不會受影響。

二、結合Bootstrap Modal作彈出表格子頁面,並獲取當前選中的數據后更新到父頁面中:

功能說明:

用戶點父頁面中的某一輸入框,系統會彈出一個查詢界面,供用戶檢索選擇相關的數據。

頁面布局思路:

首先創建一個Modal分部視圖:

 1 <!-- Modal -->
 2 <div class="modal fade" role="dialog" aria-labelledby="gridSystemModalLabel" id="gridSystemModal">
 3   <div class="modal-dialog" role="document">
 4     <div class="modal-content">
 5       <div class="modal-header">
 6         <button type="button" class="close" data-dismiss="modal" aria-label="Close"><span aria-hidden="true">&times;</span></button>
 7         <h4 class="modal-title" id="gridSystemModalLabel">xxxx查詢</h4>
 8       </div>
 9       <div class="modal-body">
10           <div class="container-fluid" id="fjShipChkList">
11               @Html.Partial("Modal/FjShipChkList")
12           </div>
13       </div>
14       <div class="modal-footer">
15         <button type="button" class="btn btn-default" data-dismiss="modal">關閉</button>
16         <button type="button" class="btn btn-primary">選擇</button>
17       </div>
18     </div><!-- /.modal-content -->
19   </div><!-- /.modal-dialog -->
20 </div><!-- /.modal -->
Modal分布視圖:CustomModal

以及我們要顯示業務數據的列表分部視圖,並被Modal分部視圖調用:

 1 <div class="row table-toolbar">
 2     <div class="col-md-12">
 3         <div class="pull-right form-inline">
 4             <div class="form-group">
 5                 <div class="input-group input-medium">
 6                     <input type="text" class="form-control input-search" placeholder="航次" id="fjShipChkList-keyword" name="keyword" value="" />
 7                     <span class="input-group-btn">
 8                         <button class="btn btn-success btn-search" type="button" id="modal-search">搜索</button>
 9                     </span>
10                 </div>
11             </div>
12         </div>
13     </div>
14 </div>
15 
16     <table class="table table-striped table-bordered table-hover js-table" data-toggle="table"
17            data-url="data1.json" data-height="299" data-click-to-select="true" 
18             data-select-item-name="radioName" id="table-ShipChk">
19         <thead>
20         <tr>
21             <th data-field="state" data-radio="true"></th>
22             <th class="sorting" aria-column="SHIP_NM">船名</th>
23             <th class="sorting" aria-column="SHIP_NM_EN">英文船名</th>
24             <th class="sorting" aria-column="VOY_ID">航次</th>
25             <th class="sorting" aria-column="DOCK_BTH_NM">停靠泊位</th>
26             <th class="sorting" aria-column="ARR_DT">到港時間</th>
27         </tr>
28         </thead>
29         <tbody id="body-fjShipChkList">
30         @if (Model.GetType() != typeof (QUARANTINE_HANDLE_RESULT))
31         {
32             int i = 0;
33             foreach (VOYAGE_DYNM item in Model.PageList)
34             {
35                 <tr class="odd gradeX">
36                     <td class="bs-checkbox"><input data-index="@(i++)" name="radioName" type="radio"></td>
37                     <td>
38                         @Html.DisplayFor(it => item.SHIP_NM)
39                     </td>
40                     <td>
41                         @Html.DisplayFor(it => item.SHIP_NM_EN)
42                     </td>
43                     <td>
44                         @Html.DisplayFor(it => item.VOY_ID)
45                     </td>
46                     <td>
47                         @Html.DisplayFor(it => item.DOCK_BTH_NM)
48                     </td>
49                     <td>
50                         @Html.DisplayFor(it => item.ARR_DT)
51                     </td>
52                 </tr>
53             }
54         }
55         </tbody>
56     </table>
業務數據分部視圖

在父頁面中調用Modal分部視圖:

@Html.Partial("Modal/CustomModal")

引入Modal分部視圖的位置最好是與父頁面中的頂層元素為兄弟節點,避免Modal調用失敗。

需要在啟動Modal 彈出層的元素上加上:data-toggle="modal" data-target="#gridSystemModal"就可以啟動Modal了。點探索時,用ajax從后台取數據,並返回一個分部視圖,返回成功后直接替換原有的業務數據分部視圖。

好了,說了這么多都和我們的主角沒多大關系,現在言歸正傳,搬出我們的主角。現在Modal登場了,我們會想,怎么讓這個彈出頁面和我們的父頁面交互數據呢?我采用的方式是Bootstrap Table,原因很簡單:Bootstrap Table天生就是用來處理bootstrap table的,功能強悍,使用簡單。

首先,在我們的業務數據分部視圖中,

 1 <table class="table table-striped table-bordered table-hover js-table" data-toggle="table"
 2            data-url="data1.json" data-height="299" data-click-to-select="true" 
 3             data-select-item-name="radioName" id="table-ShipChk">
 4         <thead>
 5         <tr>
 6             <th data-field="state" data-radio="true"></th>
 7             <th class="sorting" aria-column="SHIP_NM">船名</th>
 8             <th class="sorting" aria-column="SHIP_NM_EN">英文船名</th>
 9             <th class="sorting" aria-column="VOY_ID">航次</th>
10             <th class="sorting" aria-column="DOCK_BTH_NM">停靠泊位</th>
11             <th class="sorting" aria-column="ARR_DT">到港時間</th>
12         </tr>
13         </thead>
14         <tbody id="body-fjShipChkList">
15         @if (Model.GetType() != typeof (QUARANTINE_HANDLE_RESULT))
16         {
17             int i = 0;
18             foreach (VOYAGE_DYNM item in Model.PageList)
19             {
20                 <tr class="odd gradeX">
21                     <td class="bs-checkbox"><input data-index="@(i++)" name="radioName" type="radio"></td>
22                     <td>
23                         @Html.DisplayFor(it => item.SHIP_NM)
24                     </td>
25                     <td>
26                         @Html.DisplayFor(it => item.SHIP_NM_EN)
27                     </td>
28                     <td>
29                         @Html.DisplayFor(it => item.VOY_ID)
30                     </td>
31                     <td>
32                         @Html.DisplayFor(it => item.DOCK_BTH_NM)
33                     </td>
34                     <td>
35                         @Html.DisplayFor(it => item.ARR_DT)
36                     </td>
37                 </tr>
38             }
39         }
40         </tbody>
41     </table>
業務數據Table

加入了:data-url="data1.json" data-height="299" data-click-to-select="true"  data-select-item-name="radioName",其中data-select-item-name指明我們的表格是radio方式的,只能選擇其中某一行(當然也可以支持多行選擇)。然后再按官方文檔,上個小菜,一切即將搞定,是該收拾下班了:

 1 $("#gridSystemModal .btn-primary").click(function () {
 2         var selectRow = $("#table-ShipChk").bootstrapTable('getSelections');
 3 
 4         if (selectRow.length < 1) {
 5             selectRow = $table.bootstrapTable('getSelections');
 6             if (selectRow.length < 1){
 7             alert("請先選擇船舶!");
 8             return;
 9         }
10         }
11         $("#SHIP_NAME").val(selectRow[0][1].trim());
12         $("#VOYAGE_NO").val(selectRow[0][3].trim());
13         $("#SHIP_NM_EN").val(selectRow[0][2].trim());
14         $("#DOCK_BTH_NM").val(selectRow[0][4].trim());
15         $("#ARR_DT").val(selectRow[0][5].trim());
16         $("#gridSystemModal").modal('hide');
17     });
獲取選中的數據行

But,意外發生了,就算我把那個選擇按鈕點破了,也選不中我要的數據。Why???為什么,為什么。。查官方文檔,就是一名$("#table-ShipChk").bootstrapTable('getSelections')搞定的事,為什么在我這就搞不定了,度娘,GG一無所獲。用Bootstrap Table的初衷,就是它簡單,強大呀,怎么會這樣呢,好吧,加班,查查查。。

問題就出在,每次ajax請求數據后,我都是返回一個新的分部視圖去替換原有的分部視圖,替換后沒有把Bootstrap Table啟動起來,別人還在睡大覺呢,你怎么‘getSelections’,它都不鳥你。

好吧,在ajax success中補它一刀:$("#table-ShipChk").bootstrapTable();

好了,Bootstrap Table醒了,我可以下班了。

未完,無續。。





免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM