­

如何動態生成EasyUI的表頭

需求

前幾天遇到了這樣一個需求,在頁面上展示一組數據,但是表頭不固定,需要動態加載出來。比如這次查詢表頭有【姓名】【年齡】,可能下次查詢表頭就變成了【姓名】【年齡】【性別】。

思路簡介

我剛剛接手這個項目,前端技術用的是EasyUI,不大熟悉。翻看了一下前人的代碼,表頭都是寫死的。在網上查了一下,形形色色的答案,但是思路大致是統一的,無非就是把datagrid的columns拼出來,只是在前端拼還是在後端拼的問題。
我覺得還是在前端拼比較好,看起來沒有那麼亂。大概就是說後端封裝一個對象包含比如title、filed、width等屬性,然後將這個對象的數組返回給前端。前端通過JS遍歷這個數組,拼接出需要的數據結構,賦值給columns。
但是我沒有用這種方式,因為我是一個後端選手,還是用後端代碼寫起來更得心應手些。
後端的寫法最初我是定義了一個 TableHeader 對象,把前端需要的字段封裝起來,然後前端,直接將接收到的數組賦值到 columns,不需要再進行其他處理。

public class TableHeader{
String title;
String filed;
int width;
}

這種寫法有一個問題,就是當我需要為數據添加 formatter 函數進行數據處理的時候,我需要的是 formatter : function(value,row,index){…} 這種數據格式,但是json解析出來給我加上了雙引號 「formatter」:「function(value,row,index){…}「。我不知道怎麼去掉這個雙引號,所以選擇的另外一種簡單粗暴的方式,拼接字符串。

代碼展示

後端提供數據的方法:

public String getTableHeaders(Object param) {
    StringBuilder sb = new StringBuilder();
    sb.append("["); 
    List<String> columns = baseDao.getDynamicColumns(param);
    if (columns.isEmpty()) { 
        sb.append("]"); 
    } elsefor (String column : columns) { 
        String str = String.format("{field:\"%s\", title:\"%s\", width:%d, align:\"right\"},",column,column, 150);          
        sb.append(str);     
        }        
        sb.replace(sb.length() - 1, sb.length(), "]");   
    }    return sb.toString();
}

如果需要添加formatter或者rowstyler函數,直接在字符串里拼就行了。不大好看,但是絕對好使。

前端調取數據的方法:

var columns = [[]];
$.ajax({    
    type: "post"async: false// 這裡要注意設置為false, 表頭要先於數據加載
    data: param,   
    dataType: "json",  
    traditional: true, //這裡設置為true  
    url: ctx + "/report/" + headerUri + "/tableheaders",  
    success: function (ret) {    
    columns = [eval(ret)]; // 這裡要注意使用 eval() 方法解析字符串 
 }});
    $('#list').datagrid({ 
        url:'xxxxx',
        queryParams:xxxx,
        rownumbers: true,
        columns: columns
 })

其實只要思路搞清楚,實現起來並不複雜。

easyUI 是一個有點老但是十分簡單的框架,文檔也很清晰,在使用它的時候不妨多看看文檔,有時候比在網上搜來搜去更有效。比如動態顯隱行,一個rowStyler就能解決的問題,網上好多人搞得很複雜,甚至有說easyUI不支持的,很是誤導人。

rowStyler: function (index, row) {
                    if (row.indicator == '1') {                 
                            return 'display:none';
                        }else{
                            return 'background-color: yellow;';
                        }
                    }
                }

前人的經驗,不可不信,不可盡信。