今天要做一個報表導入並預覽的功能,使用layui的文件上傳,獲取表格數據,接着把表格數據返回前台,使用bootstraptable展示,實現一個預覽表格數據的效果。通過後台處理後的數據bootstraptable加載數據,其實具體實現不難,今天要講的是在實現數據加載之後,我們出現了一些問題,我會附源碼講解問題的解決方案分享給大家
通過後台處理後的數據
// 數據經過處理後,真實數據已做修改
Data = [
{JJSRBY: 6666,JJSRBYLJ: 155666,JJZCBY: 777,JJZCBYLJ: 2266633,LJJY: 151515,NCYE: 121212,SZYEBY: 11111,SZYEBYLJ: -11559,XZ: "企業職工基本養老保險",ZFNL: 22.1},
{JJSRBY: 6666,JJSRBYLJ: 155666,JJZCBY: 777,JJZCBYLJ: 2266633,LJJY: 151515,NCYE: 121212,SZYEBY: 11111,SZYEBYLJ: -11559,XZ: "工傷保險",ZFNL: 22.1},
...
];bootstraptable加載數據
// field 需要和 Data中每個對象中的字段名對應。
//
$('#previewTable').bootstrapTable({
data : Data,
//toolbar: '#toolBar',
striped: true, //是否顯示行間隔色
cache: false, //是否使用緩存,默認為true,
//minimumCountColumns: 2, //最少允許的列數
clickToSelect: true, //是否啟用點擊選中行
columns: [
[
{field : 'XZ', title: '險種', rowspan:2, align:"center"},
{field : 'NCYE', title: '年初餘額', rowspan:2,halign:"center",align:"right",
formatter: function(value, row, index) {
let num = row.NCYE;
return num.toFixed(2);
}
},
{title: '基金收入', colspan:2,align:"center"},
{title: '基金支出', colspan:2,align:"center"},
{title: '當年收支結餘', colspan:2,align:"center"},
{field : 'LJJY',title:'累計結餘', rowspan:2,halign:"center",align:"right",
formatter: function(value, row, index) {
let num = row.LJJY;
return num.toFixed(2);
}
},
{field : 'ZFNL',title: '支付能力(月)', rowspan:2,halign:"center",align:"right",
formatter: function(value, row, index) {
let num = row.ZFNL;
return num.toFixed(1);
}
},
],
[
{field : 'JJSRBY',title:'本月', colspan:1,halign:"center",align:"right",
formatter: function(value, row, index) {
let num = row.JJSRBY;
return num.toFixed(2);
}
},
{field : 'JJSRBYLJ',title:'本月止累計', colspan:1,halign:"center",align:"right",
formatter: function(value, row, index) {
let num = row.JJSRBYLJ;
return num.toFixed(2);
}
},
{field : 'JJZCBY',title:'本月', colspan:1,halign:"center",align:"right",
formatter: function(value, row, index) {
let num = row.JJZCBY;
return num.toFixed(2);
}
},
{field : 'JJZCBYLJ',title:'本月止累計', colspan:1,halign:"center",align:"right",
formatter: function(value, row, index) {
let num = row.JJZCBYLJ;
return num.toFixed(2);
}
},
{field : 'SZYEBY',title:'本月', colspan:1,halign:"center",align:"right",
formatter: function(value, row, index) {
let num = row.SZYEBY;
return num.toFixed(2);
}
},
{field : 'SZYEBYLJ',title:'本月止累計', colspan:1,halign:"center",align:"right",
formatter: function(value, row, index) {
let num = row.SZYEBYLJ;
return num.toFixed(2);
}
}
]
],
formatNoMatches : function() {
return '<div style="color: #b8b8b8; height: 15px;"> 暫無數據 </div>';// 如果無數據則顯示這個
}
});這個實現其實不難,但是,沒想到的是,接下來的步驟出問題了,因為我們需要實現BootstrapTable重新加載,這種問題有以下兩種解決方案:
原始加載的表格
解決後加載表格
最重要的一點,寫在最前面:BootstrapTable一個頁面只能加載一次;想要重新加載,就必須先銷毀 , 再重新初始化Bootstraptable。
銷毀的方法:
$(‘#id’).bootstrapTable(‘destroy’);
好了,接下來我們來看以以下具體實現方式
遇到此問題的情景
在table上方添加了文本輸入框,用於查詢過濾table中的數據,因此需要根據查詢條件,重新向後台向DAO層發送請求,返回新的結果。
解決辦法
原始加載的表格
這是一開始進入頁面加載的表格。
$('#infoList').bootstrapTable({
url: '${pageContext.request.contextPath}/xx/xxx', //請求後台的URL(*)
method: 'post', //請求方式(*)
contentType: 'application/x-www-form-urlencoded',
toolbar: '#toolbar', //工具按鈕用哪個容器
striped: true, //是否顯示行間隔色
cache: false, //是否使用緩存,默認為true,所以一般情況下需要設置一下這個屬性(*)
pagination: true, //是否顯示分頁(*)
sortable: false, //是否啟用排序
sortOrder: "desc", //排序方式
sidePagination: "server", //分頁方式:client客戶端分頁,server服務端分頁(*)
pageNumber: 1, //初始化加載第一頁,默認第一頁
pageSize: 10, //每頁的記錄行數(*)
pageList: [10, 50, 100], //可供選擇的每頁的行數(*)
strictSearch: true,
showColumns: false, //是否顯示所有的列
showRefresh: false, //是否顯示刷新按鈕
minimumCountColumns: 2, //最少允許的列數
clickToSelect: true, //是否啟用點擊選中行
//uniqueId: "aac147", //每一行的唯一標識,一般為主鍵列
showToggle: false, //是否顯示詳細視圖和列表視圖的切換按鈕
cardView: false, //是否顯示詳細視圖
detailView: false, //是否顯示父子表
queryParams: queryParams, //所需要的參數
queryParamsType: "limit", //參數格式,發送標準的RESTFul類型的參數請求
columns: myColumns, // 列名這裡通過別處方法加載
onClickRow: function (row, obj) { //點擊事件
...
},
onLoadSuccess: function (data) {
...
}
});
function queryParams(params) { //配置參數
var temp = { //這裡的鍵的名字和控制器的變量名必須一直,這邊改動,控制器也需要改成一樣的
pageSize: params.limit, //頁面大小
pageNumber: (params.offset / params.limit) + 1, //頁碼
};
return temp;
}
1234567891011121314151617181920212223242526272829303132333435363738394041想要實現的效果:
此時我需要在表格上方,加上文本輸入框,並添加 查詢按鈕 ,點擊查詢按鈕,把輸入的條件加入到 表格參數 queryParams 中,通過數據庫的查詢 返回數據,並更改表格結構和內容,做到重新加載的效果。
但是失敗了。
解決後加載表格
需要在點擊查詢按鈕時,首先調用 表格銷毀方法
$('#infoList').bootstrapTable('destroy');接着再重新加載新的表格:
$('#infoList').bootstrapTable({
url: '${pageContext.request.contextPath}/xx/xxx2', //請求後台的URL(*)
method: 'post', //請求方式(*)
contentType: 'application/x-www-form-urlencoded',
toolbar: '#toolbar', //工具按鈕用哪個容器
striped: true, //是否顯示行間隔色
cache: false, //是否使用緩存,默認為true,所以一般情況下需要設置一下這個屬性(*)
pagination: true, //是否顯示分頁(*)
sortable: false, //是否啟用排序
sortOrder: "desc", //排序方式
sidePagination: "server", //分頁方式:client客戶端分頁,server服務端分頁(*)
pageNumber: 1, //初始化加載第一頁,默認第一頁
pageSize: 10, //每頁的記錄行數(*)
pageList: [10, 50 ,100], //可供選擇的每頁的行數(*)
strictSearch: true,
showColumns: false, //是否顯示所有的列
showRefresh: false, //是否顯示刷新按鈕
minimumCountColumns: 2, //最少允許的列數
clickToSelect: true, //是否啟用點擊選中行
showToggle: false, //是否顯示詳細視圖和列表視圖的切換按鈕
cardView: false, //是否顯示詳細視圖
detailView: false, //是否顯示父子表
queryParams: function(params){
return {
pageSize: params.limit, //頁面大小
pageNumber: (params.offset / params.limit) + 1, //頁碼
keyword: $("#search_json").val(), // 關鍵詞
};
},
queryParamsType: "limit", //參數格式,發送標準的RESTFul類型的參數請求
columns: myColumns,
onClickRow: function (row, obj) {
...
},
onLoadSuccess: function (data) {
...
}
});
function queryParams2(params) { // 配置參數 有查詢條件用
var keyword = $("#search_json").val();
var temp = { //這裡的鍵的名字和控制器的變量名必須一直,這邊改動,控制器也需要改成一樣的
pageSize: params.limit, //頁面大小
pageNumber: (params.offset / params.limit) + 1, //頁碼
keyword: keyword // 查詢關鍵詞
};
return temp;
}注意:具體實現代碼太過龐大,所以以上代碼並不完整隻是提供思路。
原創文章,作者:投稿專員,如若轉載,請註明出處:https://www.506064.com/zh-hk/n/268512.html
微信掃一掃
支付寶掃一掃