因為我前台選擇的是easyui框架,一般用於顯示表格都是在datagrid的columns定義filed和title,但是這個需求就無法事先定義好這些屬性,只有在運行時才能裝載這些組件,怎麼辦呢?看了很多網上的信息,發現講的都很模糊,要不就是簡單問題復雜化,要不就是一言帶過,於是就決定自己弄,畢竟看別人的東西只是個啟發。廢話不多說,開始。
難點:
1.前台js動態生成datagrid配置
2.後台json動態裝配
解決辦法:
對於第一個難點,
弄懂核心原理是最重要的,核心就是 重新生成column字符串。意思就是說,原先是前台js事先寫死,但是現在傳一個值過去,格式和原先保持一致就可以了。
既然知道這個原理了,那問題就迎刃而解了,我先調用後台處理方法,再返回對應格式的字符串給前台就行了。即保證前台獲取的json格式如下:
{"total":23,
"rows":[
{"3":0,"2":91940.0,"1":0,"4":50000.0,"detailSubject":"01.1 購置設備費"},
{"3":36000.0,"2":0,"1":80000.0,"4":0,"detailSubject":"01.2 研制設備費"}],
"columns":[[{"field":"detailSubject","width":100,"title":"明細科目"},
{"field":"1","width":100,"title":"D0 材料部"},
{"field":"2","width":100,"title":"D1 工程部"},
{"field":"3","width":100,"title":"D2 軟件部"},
{"field":"4","width":100,"title":"D3 物理部"}]]
}$(function(){
//初始化
$("#pivotTable_datagrid").datagrid({
type: 'POST',
pagination:true,
rownumbers:true,
fit:true,
width:1024,
height:500,
nowrap: false,
border: false,
pageSize:10,
singleSelect:true
});
loadDatagrid();
});
function loadDatagrid() {
$.ajax({
url: path+'/pivotTable/datagrid',
type:"POST",
success: function(data){
var options = $("#pivotTable_datagrid").datagrid("options"); //取出當前datagrid的配置
var json = decodeURIComponent(data.columns);//解碼
console.info(json);
options.columns = eval(json);
$('#pivotTable_datagrid').datagrid(options);
$('#pivotTable_datagrid').datagrid("loadData", data.rows);//實例化之後立刻載入數據源,加載本地數據,舊的行會被移除。
}
});
} /**
* 生成透視表,
*/
function create() {
var database = $('#pivotTable_searchForm input[name=database]').val();
var colTag = $('#pivotTable_searchForm input[name=colTag]').val();
var rowTag = $('#pivotTable_searchForm input[name=rowTag]').val();
console.info(database);
if (database.trim() == "") {
$.messager.alert('提示', '請先選擇數據源!', 'info');
}else if(colTag.trim() == "" && rowTag.trim() == ""){
$.messager.alert('提示', '請至少選擇一個行標簽或者列標簽!', 'info');
}else if(colTag.trim() == rowTag.trim()){
$.messager.alert('提示', '親,行標簽和列標簽不能一樣哦!', 'info');
}else{
console.info(database);
console.info(colTag);
console.info(rowTag);
var url = path+'/pivotTable/datagrid?database='+database
+'&colTag='+colTag+'&rowTag='+rowTag;
$.ajax({
url : url,
dateType : 'json',
type : 'post',
success : function(r) {
console.info(r.columns);
$('#pivotTable_datagrid').datagrid({
url : url,
fit : true,
border : false,
pagination : true,
rownumbers : true,
fitColumns : true,
columns : r.columns //這裡提取後台傳過來的json數組裡的columns數據,
});
}
});
}
} 第二個難點,我怎麼在後台生成動態的column的json?(因為筆者是用java的springmvc寫的,所以可能下面方法只適合javaer)
很簡單,如果實體類的屬性知道,就一個通過java反射獲取,填充到column的field的屬性裡。先看代碼:
後台:
/**
* 生成透視表
* @return
*/
@ResponseBody
@RequestMapping("/pivotTable/datagrid"){
DataGrid dg = new DataGrid(); //這個是用於向前台傳送整個json數據的實體bean
PageHelper page = new PageHelper(); //用於後台分頁的
List columnList = new ArrayList();
Map column = new HashMap();
column.put("applyDate", "日期");
column.put("proBriefName", "項目簡稱");
column.put("activityCode", "財務計劃編號");
column.put("applicant", "申請人");
column.put("amount", "金額");
column.put("fundPurpose", "經費用途");
column.put("loanNo", "借款單號");
// 獲取實體類的所有屬性,返回Field數組
LoanBean t = new LoanBean();
Field[] field = t.getClass().getDeclaredFields();
// 遍歷所有屬性
for (int j = 0; j < field.length; j++) {
DatagridColumn dc = new DatagridColumn();
// 獲取屬性的名字
String name = field[j].getName();
dc.setField(name);
dc.setTitle(column.get(name));
dc.setWidth(80);
columnList.add(dc);
}
String columnJson = JSON.toJSONString(columnList, SerializerFeature.UseSingleQuotes);
System.out.println("json格式的column為:"+columnJson);
columnJson = "["+columnJson+"]";
/*
//columns需要後台生成
String columns = "[[";
columns = columns + "{field:'applyDate',title:'日期',width:80},";
columns = columns + "{field:'proBriefName',title:'項目簡稱',width:80},";
columns = columns + "{field:'activityCode',title:'財務計劃編號',width:80},";
columns = columns + "{field:'applicant',title:'申請人',width:80},";
columns = columns + "{field:'amount',title:'金額',width:80},";
columns = columns + "{field:'fundPurpose',title:'經費用途',width:80},";
columns = columns + "{field:'loanNo',title:'借款單號',width:80}";
columns = columns + "]]";
*/
try {
columnJson = URLEncoder.encode(columnJson,"UTF-8");
} catch (UnsupportedEncodingException e) {
e.printStackTrace();
}
System.out.println(columnJson);
//根據條件查詢總數
Long total = financeService.loanCount(page);
dg.setTotal(total);
//根據條件查詢List
List loanList = financeService.loanList(page);//這裡是重點
dg.setRows(loanList);
dg.setColumns(columnJson);
return dg;
}
/**
* 根據結果集、表頭Title和Field映射Map、行標簽,生成Map類型的rows
* @param rlist
* @param colMap
* @param rowTag
* @return
*/
public List