1. 程式人生 > >bootstrap的table外掛動態載入表頭【表頭】。

bootstrap的table外掛動態載入表頭【表頭】。

bootstrap的table屬性已經很熟悉了,最近遇到一個問題,猶豫每個列表載入的資料需求不同,所以需要動態的更換表頭。 網上有很多載入表格資料的例子,但是卻沒有找到如何動態載入表格,再加在資料。 雖然可以一個表格載入一種資料,但是本著學習的態度嘗試了下這種方式,結果發現是可以執行的。分享下思路和實現過程,以備日後使用。

思路:

1、寫介面,查詢出要展示的列。注意介面中必須要有欄位中文名稱(columns屬性的title值),欄位的英文名稱(columns的field欄位),特別注意filed欄位應該與最後查詢出的列表中返回的json資料中的key保持一致,不然取不到值。

2、ajax請求剛才的介面,查詢出columns,並給table的columns賦值。

3、載入表格展示。

大致程式碼如下:

表格:

var peopleOptions;
// 人口列表載入
function tableItem() {
    peopleOptions = {
        method : "POST", // 使用get請求到伺服器獲取資料
        url : path + "/api/information/people/getList", // 獲取資料的地址
        contentType : "application/x-www-form-urlencoded",// 重要否則POST會報錯
        striped : false, // 表格顯示條紋
        pagination : true, // 啟動分頁
        pageSize : 10, // 每頁顯示的記錄數
        pageNumber : 1, // 當前第幾頁
        pageList : [ 10, 20, 50 ], // 記錄數可選列表
        uniqueId : "id",
        showColumns : false, // 顯示下拉框勾選要顯示的列
        showToggle : false, // 顯示 切換試圖(table/card)按鈕
        clickToSelect : false, // 點選可選
        singleSelect : false, // 禁止多選
        maintainSelected : true, // 在點選分頁按鈕或搜尋按鈕時,將記住checkbox的選擇項
        sortable : true, // 禁止所有列的排序
        sidePagination : "server", // 表示服務端請求 後臺分頁
        toolbar : "#toolbar",// 指明自定義的toolbar
        queryParamsType : "undefined",
        queryParams : function queryParams(params) {
            var param = {
                pageNumber : params.pageNumber,
                pageSize : params.pageSize,
                orgId : ztreeId,
                nodeId : ztreeId,
                citizenName : $("#fullname").val().trim(),
                sex : $("#sex").val(),
                age : $("#age").val().trim(),
                identityCode : $("#idCard").val().trim(),
                cellPhone : $("#isMobile").val().trim(),
                adress : $("#adress").val().trim(),
            };
            return param;
        },
        onLoadSuccess : function() { // 載入成功時執行
            responseHandler : function(res) { // 格式化資料
                console.log(res);
                if (res.data.total != undefined)
                    tmp = {
                        total : res.data.total,
                        rows : res.data.rows
                    };
                if (res.data.total == undefined)
                    tmp = {
                        total : res.data.length,
                        rows : res.data
                    };
                return tmp;
            },
            columns : [ {
                checkbox : true,
                title : '全選',
                valign : 'middle'
            }, {
                title : '序號',
                field : 'number',
                width : '40px',
                align : 'center',
                valign : 'middle',
                formatter : indexFormatter
            }, {
                title : '姓名',
                field : 'citizenName',
                align : 'center',
                valign : 'middle',
            },  {
                title : '年齡',
                field : 'age',
                align : 'center',
                width : 28,
                valign : 'middle',
                formatter : ageFormatter
            }, {
                title : '性別',
                field : 'sex',
                width : 28,
                align : 'center',
                valign : 'middle',
            },{
                title : '身份證號',
                field : 'identityCode',
                align : 'center',
                valign : 'middle',
            }, {
                title : '民族',
                field : 'nation',
                align : 'center',
                valign : 'middle',
            } ]
        }
}
    $table = $("#table").bootstrapTable(peopleOptions);
};

動態獲取列:

function getColumns() {
	// 載入動態表格
	$.ajax({
		url : path + "api/information/people/getLableColumn?ztreeId=" + ztreeId,
		type : 'get',
		dataType : "json",
		async : false,
		success : function(returnValue) {
			// 未查詢到相應的列,展示預設列
			if (returnValue.retCode == "0") {
				//沒查到列的時候把之前的列再給它
				myColumns = $table.bootstrapTable('getOptions').columns[0];
			} else {
				// 非同步獲取要動態生成的列
				var arr = returnValue.data;
				$.each(arr, function(i, item) {
					myColumns.push({
						"field" : item.labelColumnCode,
						"title" : item.labelColumnName,
						"hide" : true,
						"align" : 'center',
						"valign" : 'middle'
					});
				});
			}
			console.log(myColumns);
			return myColumns;
		}
	});
}

重新整理列表:

//點選左側樹後重新載入表格
	$table.bootstrapTable(  
	              "refreshOptions",  
	              {  
	            	url : path + "/api/peopledataInfo/getPeopleInfoList", // 獲取資料的地址
	            	columns : myColumns,
	            	
	              }  
	      );
	  } 

需要注意的是bootstrap的table提供了兩個重新整理的方法,一個refresh,一個refreshOptions,前者只是重新整理當前表格,後者會將表格中的元件全部更新一遍,因為我們替換了url和columns,所以需要呼叫後者。

展示效果:

動態載入表頭其實就是類似Echart中動態載入資料的感覺一樣,只是改變整個Option中的相關屬性即可。

優點:程式碼量會大大減少,當我們要載入不同資料且樣式一樣的表格的時候可以採用這樣的方式。

缺點:樣式很難維護。前端人員不好定位bug,所以很難修改相應的樣式bug。

依據專案實際情況,擇優使用吧。