1. 程式人生 > >laydate日期元件的使用和Bootstrap Table表格神器的使用學習心得

laydate日期元件的使用和Bootstrap Table表格神器的使用學習心得

####laydate:Layui框架下的日期元件

####Bootstrap Table:基於 Bootstrap 的 jQuery 表格外掛,通過簡單的設定,就可以擁有強大的單選、多選、排序、分頁,以及編輯、匯出、過濾(擴充套件)等等的功能

#####使用文件:

專案中出現了新需求,模組搜尋條件中的日期條件需要進行預設設定,在每次請求當前模組頁面時,所查詢的資料列表的日期條件為當前日期。
當然,這對於精通JS的童鞋,幾乎就是撓癢癢的需求,我一個前端戰五渣,也需要做一點前端的操作,包括之前的微信資訊接收請求,也是對自己只是的補充吧,話說最近也有了學習beetl的想法,關於這個JS吧,還是需要學習一下的。

請求步驟

請求由Controller接收:/productBasicInfo,返回的是一個html頁面。

/**
 * 跳轉到產品基礎資訊首頁
 */
@RequestMapping("")
public String index() {
    return PREFIX + "productBasicInfo.html";
}

這裡的頁面是一個div塊,頁面被分隔成三部分,模組頁面部分都被嵌入到_container.html中。

日期條件:
<div class="col-sm-2">
    <#TimeCon id="beginTime" name="開始日期" isTime="false" pattern="YYYY-MM-DD"/>
</div>
<div class="col-sm-2">
    <#TimeCon id="endTime" name="結束日期" isTime="false" pattern="YYYY-MM-DD" />
</div>
這裡需要說一下這個<#TimeCon>,這是一個時間查詢的條件標籤,已封裝好的模組。
@/*
時間查詢條件標籤的引數說明:

name : 查詢條件的名稱
id : 查詢內容的input框id
isTime : 日期是否帶有小時和分鐘(true/false)
pattern : 日期的正則表示式(例如:"YYYY-MM-DD")
@*/
<div class="input-group">
    <div class="input-group-btn">
        <button data-toggle="dropdown" class="btn btn-white dropdown-toggle"
                type="button">${name}
        </button>
    </div>
    <input type="text" class="form-control layer-date"
           onclick="laydate({istime: ${isTime}, format: '${pattern}'})" id="${id}"/>
</div>

看到這裡相信你就明白了,封裝好的時間查詢條件標籤原面目,由於採用的時間元件是laydate,這個時間元件是Layui的一個元件,詳情可看Layui官方文件:https://www.layui.com/doc/modules/laydate.html

主角1號:laydate舊版本的部分API:

核心方法:laydate(options)

options是一個物件,它包含了以下key: '預設值'

elem: '#id', //需顯示日期的元素選擇器
event: 'click', //觸發事件
format: 'YYYY-MM-DD hh:mm:ss', //日期格式
istime: false, //是否開啟時間選擇
isclear: true, //是否顯示清空
istoday: true, //是否顯示今天
issure: true, 是否顯示確認
festival: true //是否顯示節日
min: '1900-01-01 00:00:00', //最小日期
max: '2099-12-31 23:59:59', //最大日期
start: '2014-6-15 23:00:00',    //開始日期
fixed: false, //是否固定在可視區域
zIndex: 99999999, //css z-index
choose: function(dates){ //選擇好日期的回撥
    ...
}

其他常用方法:

/*
layer.now支援多型別引數。timestamp可以是前後若干天,也可以是一個時間戳。format為日期格式,為空時則採用預設的“-”分割。
如laydate.now(-2)將返回前天,laydate.now(3999634079890)將返回2096-09-28
*/
layer.now(timestamp, format);   //該方法提供了豐富的功能,推薦靈活使用。

laydate.reset();    //重設日曆控制元件座標,無參,一般用於頁面dom結構改變時。

在需要實現的功能上便採用了上述API中的內容。

改造productBasicInfo.html

方法上採用了內部JS方式,廢話不多說,上程式碼:

<script type="text/javascript">
    //按照上述的核心方法建立物件:options
	var begin = {
        elem:'#beginTime',
        format:'YYYY_MM_DD',
        max:laydate.now(),
        istime: false,
        istoday: false,
        choose: function (datas) {
            end.min = datas;  //開始日選好後,重置結束日的最小日期
            end.start = datas //將結束日的初始值設定為開始日
        }
    };

    var end = {
        elem:'#endTime',
        format: 'YYYY-MM-DD',
        max: laydate.now(),
        istime: false, 
        istoday: false,
        isclear: true, 
        issure: true, 
        choose: function (datas) {
            begin.max = datas; //結束日選好後,重置開始日的最大日期
        }
    };

	//核心方法呼叫,載入物件。
    laydate(begin);
    laydate(end);

    //給input設定初始預設值,時間差為30天,參照上述常用方法laydate.now()。
    $('#beginTime').val(laydate.now(-30, 'YYYY-MM-DD'));
    $('#endTime').val(laydate.now(0, 'YYYY-MM-DD'));

</script>

上述程式碼,在查閱文件後,分解開來並沒有很難理解,完全參照文件進行的操作。

到現在,已經實現了日期的預設值配置,也配置了日期物件begin、end的相關屬性和回撥方法。接下來需要進行的是將預設好的預設日期引數傳入Controller中。

在productBasicInfo.html中程式碼底部存在一個外部JS引入,這也就是我們的突破口。

<script src="${ctxPath}/static/modular/infoMgr/productBasicInfo/productBasicInfo.js"></script>

進入productBasicInfo.js:頁面返回後便會呼叫該外部JS

預設載入方法:

$(function () {
    var defaultColunms = ProductBasicInfo.initColumn();
    var table = new BSTable(ProductBasicInfo.id, "/productBasicInfo/list", defaultColunms);
    table.setPaginationType("client");
	//這裡是要新增自定義引數的哦!!!
    ProductBasicInfo.table = table.init();
});

我們進行逐行分析:

基礎物件建立:ProductBasicInfo

/**
 * 產品基礎資訊管理初始化
 */
var ProductBasicInfo = {
    id: "ProductBasicInfoTable",	//表格id
    seItem: null,		            //選中的條目
    table: null,
    layerIndex: -1,
};

var defaultColunms = ProductBasicInfo.initColumn();

呼叫ProductBasicInfo物件的初始化列方法:

/**
 * 初始化表格的列
 */
ProductBasicInfo.initColumn = function () {
    return [
        {field: 'selectItem', radio: true},
        {title: 'Id', field: 'Id', visible: false, align: 'center', valign: 'middle'},
        {title: '產品編號', field: 'productID', visible: true, align: 'center', valign: 'middle'},
     	...
    ];
};

var table = new BSTable(ProductBasicInfo.id, “/productBasicInfo/list”, defaultColunms);

建立了一個名為table的BSTable物件,引數為當前ProductBasicInfo物件的id屬性、請求路徑、上文中建立的預設列物件

我們進入BSTable中一探究竟,這就是我們今天的主角2號:bootstrap-table-object.js

這也是已封裝好的JS模組,由於篇幅過長,這裡就不完整展示了,只展示針對我們功能實現相關的方法和屬性配置。

主角2號:BSTable物件定義

var BSTable = function (bstableId, url, columns) {
    this.btInstance = null;					//jquery和BootStrapTable繫結的物件
    this.bstableId = bstableId;
    this.url = Feng.ctxPath + url;
    this.method = "post";
    this.paginationType = "server";			//預設分頁方式是伺服器分頁,可選項"client"
    this.columns = columns;
    this.data = {};
    this.queryParams = {};                 // 向後臺傳遞的自定義引數
	..
};

針對請求引數可以得出:bstableId、url、columns引數作為物件初始化使用,這不是就是構造器嗎?

我們首先看到init()初始化方法:BSTable.prototype [prototype 屬性使您有能力向物件新增屬性和方法]

BSTable.prototype = {
    /**
     * 初始化bootstrap table
     */
    init: function () {
        var tableId = this.bstableId;
        var me = this;
        this.btInstance = ...(見下文)
        return this;
    },
    /**
     * 向後臺傳遞的自定義引數
     * @param param
     */
    setQueryParams: function (param) {
        this.queryParams = param;
    },
    /**
     * 設定分頁方式:server 或者 client
     */
    setPaginationType: function (type) {
        this.paginationType = type;
    },
	...
}

this.btInstance:jquery和BootStrapTable繫結的物件

this.btInstance =
    $('#' + tableId).bootstrapTable({
        contentType: "application/x-www-form-urlencoded",
        url: this.url,				//請求地址
        method: this.method,		//ajax方式,post還是get
        ajaxOptions: {				//ajax請求的附帶引數
            data: this.data
        },
        pagination: true,     		//是否顯示分頁(*)
        pageNumber: 1,      		//初始化載入第一頁,預設第一頁
        pageSize: 14,      			//每頁的記錄行數(*)
        pageList: [14, 50, 100],  	//可供選擇的每頁的行數(*)
        queryParamsType: 'limit', 	//預設值為 'limit' ,在預設情況下 傳給服務端的引數為:offset,limit,sort
        queryParams: function (param) {
            return $.extend(me.queryParams, param);
        }, // 向後臺傳遞的自定義引數
        sidePagination: this.paginationType,   //分頁方式:client客戶端分頁,server服務端分頁(*)
        ...
    });

初始化方法中所提及的引數初始化(這裡只保留了主要屬性),需要特別注意的有兩條:queryParamsType、queryParams。

1. queryParamsType:預設引數limit,後臺引數為offset、limit、sort

這些引數都是對資料分頁所需要的引數:相關資料分頁的引數配置:pagination、pageNumber、pageSize、pageList等,分頁配置中還有一個設定方法:setPaginationType,上述已經提到了。

分頁方式:

client客戶端分頁:BootStrapTable中設定的分頁,前端分頁,配置如上文所述。
server服務端分頁:Mybatis的PageHelper分頁外掛、Mybatis-plus的Page物件都可以實現對資料結果集resultSet的分頁。

2. queryParams:向後臺傳遞的自定義引數

這個屬性使我們所需要的,我們的目的是向後臺傳遞預設時間引數。

設定方法:setQueryParams()

在BSTable物件建立的時候:this.queryParams = { };

初始化init方法中this.btInstance裡的配置:

	queryParams: function (param) {
        return $.extend(me.queryParams, param);
    }, // 向後臺傳遞的自定義引數

結論:自定義引數需要通過setQueryParams()方法進行配置,配置完成後,將作為BSTable的物件屬性進行初始化。

改造productBasicInfo.js:在預載入方法中,BSTable物件建立後新增自定義引數的配置程式碼。

//向後臺傳遞預設的開始、結束時間引數
table.setQueryParams({'beginTime': $("#beginTime").val()});
table.setQueryParams({'endTime': $("#endTime").val()});

table.setPaginationType(“client”);

設定分頁方式為:客戶端分頁,上文中已經提到。

ProductBasicInfo.table = table.init();

所需屬性設定完成後,開始進行table物件的初始化。

至此,日期預設值設定、laydate物件配置、自定義引數傳遞設定已經全部完成,主要涉及的技術為Layui的laydate日期元件的使用和BootStrapTable的實現配置以及初始化封裝JS的配置。

關於JS等前端技術的學習,需要深入去了解。此文作為前端技術的開篇,戰五渣還是需要繼續努力啊!