基於DataTables實現根據每個使用者動態顯示隱藏列,可排序

林磚頭發表於2019-01-29

 

前言

在後臺管理系統開發中,難免會出現列數太多的情況,這裡提供一個解決方案:使用者設定顯示哪些列,每個使用者互不影響,並且可以根據使用者的習慣設定列的排序。

1、演示

2、html程式碼說明

3、javascript程式碼說明

4、總結

 

1、演示

 

2、HTML程式碼

 

<link rel="stylesheet" type="text/css" href="DataTables-1.10.15//media/css/jquery.dataTables.css">

<script type="text/javascript" language="javascript" src="DataTables-1.10.15/media/js/jquery.js"></script>

<script type="text/javascript" language="javascript" src="DataTables-1.10.15/media/js/jquery.dataTables.js"></script>

 

<table id="page-table" class="table table-bordered table-hover">

    <thead></thead>

    <tbody></tbody>

</table>

 

引入jquery跟DataTables即可,然後再寫一個table。

 

3、javascript程式碼

 

1、呼叫

new $.pageSearch({
    customColumns:{
      pageId: pageId,// 唯一ID
      pageFieldList:pageFieldList,
      // dataTables的columns引數寫這裡
      columns:{
        column1:{
          width:200
        }
      },
      // dataTables的aoColumnDefs引數寫這裡
      aoColumnDefs:{
        column2:{
          width:200,
          mRender: function (data, type, full) {
            return `custom ` + data;
          }
        }
      }
    },
    DataTable:{// 這裡保留了DataTables的引數
      data: dataList
    }
  });

customColumns物件是必傳的。

customColumns.pageId主要是存取資料用的,保證每一個例項的設定區分開來。

customColumns.pageFieleList是每個例項設定的資料,格式如下:

var pageFieldList = [{

      display: true,

      displayName: `Column1`,

      fieldName: `column1`

}];

customColumns.columns是dataTables的columns,將原來的陣列改成了物件,以data為屬性名,其他屬性保留。

customColumns.aoColumnsDefs跟customColumns.columns同理。

 

2、pageSearch裡面的程式碼

!(function () {

  function pageSearch(options){
    this.table = null;
    this.options = $.extend({
    container:`#my-page`,//容器
    settingBtn:`#setting`,//容器內的按鈕
    table:`#page-table`,//容器內的table
    customColumns:{
      pageId: ``,//(必填)自定義列需要用到的id 必須唯一
      pageFieldList: [],//(必填)頁面欄位配置
      columns: null,//列配置項
      columnDefaults: null
    },
    DataTable:{}//保留dataTables引數
    },options);

    this.main();
  }

  $.extend(pageSearch.prototype,{
    main:function(){
      this.renderThead();
      this.setDefault();
      this.initTable();
      this.events();
    },
    // 對datatables設定預設引數
    setDefault:function(){
      $.extend($.fn.dataTable.defaults,{
        searching: false,// 禁用搜尋
        ordering: false,// 禁用排序
        dom: "<`row`<`col-sm-12`tr>>" + "<`row`<`col-sm-5 page-info`li><`col-sm-7`p>>",
        scrollY: 400 // 表格裡使用滾動
      });
    },
    // 初始化dataTables
    initTable:function(){
      var opts = this.options;
      var formatColumns = this.handleDataTableOption();
      var dataTablesOption = $.extend({
        columns:formatColumns.columns,
        aoColumnDefs:formatColumns.aoColumnDefs
      },opts.DataTable);
      this.table = $(opts.table,opts.container).DataTable(dataTablesOption);
    },
    // 事件繫結
    events:function(){
      var that = this;
      var opts = this.options;
      //設定
      $(opts.settingBtn,opts.container).click(function(){
        that.actionSetting();
      });
    },
    // 把資料轉成dataTables需要的格式
    handleDataTableOption:function(){
      var customColumns = this.options.customColumns;
      var colums = [];
      var columnDefs = [];
      $.each(customColumns.pageFieldList, function (i, fieldInfo) {
          var fieldName = fieldInfo.fieldName;
          var columnDefObj = customColumns.columnDefaults && customColumns.columnDefaults[fieldName];
          colums.push($.extend({
              data: fieldName,
              visible: fieldInfo.display
          }, customColumns.columns ? customColumns.columns[fieldName] : {}));
          if (columnDefObj) {
              columnDefs.push($.extend({
                  aTargets: [i]
              }, columnDefObj));
          }
      });

      return {
          columns: colums,
          aoColumnDefs: columnDefs
      }
    },
    // 渲染表頭
    renderThead:function(){
      var that = this;
      var customColumns = this.options.customColumns;
      var thead = `<tr>`;
      $.each(customColumns.pageFieldList, function (i, fieldInfo) {
          if (fieldInfo.display) {
              thead += `<th title="` + fieldInfo.displayName + `">` + fieldInfo.displayName + `</th>`;
          } else {
              thead += `<th style="display:none;" title="` + fieldInfo.displayName + `">` + fieldInfo.displayName + `</th>`;
          }
      });
      thead += `</tr>`;
      $(`thead`, that.options.table).html(thead);
    },
    // 開始設定
    actionSetting:function(){
      var that = this;
      var list = this.options.customColumns.pageFieldList;
      dialog({
        title:`設定`,
        content:this.getDialogContent(list),
        width:300,
        height:400,
        onshow:function(){
          $(`#sortable`,this.node).sortable().disableSelection();
        },
        skin:`scroll-y`,
        okValue:`儲存`,
        ok:function(){
          var fieldList = [];
          $(`li`,this.node).each(function(){
            var data = $(this).data();
            fieldList.push({
              display: $(`[name="display"]`,this).prop(`checked`),
              displayName: data.displayName,
              fieldName: data.fieldName
            });
          });
          if(!localStorage){
            alert(`抱歉,瀏覽器不支援localStorage,資料儲存失敗!`)
          }else{
            // 這裡做本地快取,可以換成ajax
            localStorage.setItem(that.options.customColumns.pageId,JSON.stringify(fieldList));
            alert(`儲存成功`);
            that.options.customColumns.pageFieldList = fieldList;
            that.columnOptions = that.handleDataTableOption();
            // 銷燬datatables例項
            that.table && that.table.destroy();
            // 重繪表頭
            that.renderThead();
            // 用新的options重新渲染dataTables
            that.table && (that.table = $(that.options.table,that.options.container).DataTable($.extend(that.columnOptions, that.options.DataTable)));
            //關閉視窗
            this.close().remove();
          }
          return false;
        },
        cancelValue:`取消`,
        cancel:true
      }).showModal();
    },
    // 生成彈窗的內容
    getDialogContent:function(list){
      var html = ``;
      html += `<h4 class="green">可拖拽排序列表</h4>`;
      html += `<ul id="sortable">`;
      for(var i = 0;i < list.length;i++){
        html += `<li class="ui-state-default" data-display-name="` + list[i].displayName + `" data-field-name="` + list[i].fieldName + `">`;
        html += `<span>` + list[i].displayName + `</span>`;
        html += `<input type="checkbox" name="display" title="是否展示" ` + (list[i].display ? `checked="checked"` : ``) + ` />`;
        html += `</li>`;
      }
      html += `</ul>`;
      return html;
    }
  });

  $.pageSearch = pageSearch;
})();

$.pageSearch是實現功能的核心。實現了幾個方法:

1、main是程式的入口

2、setDefault對DataTables的預設設定,減少重複設定的煩惱。

3、initTable是開始對table例項化成DataTables例項。

4、events所有事件都寫在這裡。

5、handleDataTableOption將customColumns.columns和customColumns.aoColumnsDefs轉成DataTables的columns和aoColumnsDefs。

6、renderThead因表頭的排序會改變,所以要重新渲染新的表頭。

7、actionSetting是對設定的儲存,原始碼中使用localStorage儲存,大家也可以改成ajax儲存。

 

4、總結

上述只是挑選部分重要的程式碼,如需檢視完整程式碼請到我的github上檢視。

完整原始碼地址:https://github.com/ll527563266/datatables-dynamic-columns

線上預覽地址:https://ll527563266.github.io/datatables-dynamic-columns

如果您覺得閱讀本文對您有幫助,請點一下“推薦”按鈕,您的“推薦”將是我最大的寫作能力!

 

相關文章