datatable排序分頁(請求)

datatable排序分頁(請求)

@(關鍵字)[angular|datatable|排序|分頁]

datatable 此文介紹的datatable是基於angular作爲語言基礎的。其主要包含:
- 搜索條件查詢引起數據重加載
- 修改每頁顯示多少條數據引起數據重加載
- 點擊數據表的某一個字段因排序引起數據重加載
- 點擊分頁(首頁、上一頁、下一頁、尾頁、自定義輸入頁碼)引起數據重加載


Dom代碼塊

詳細的dom結構,請參照fdc_smartplatform\app\tpl\model\datatable.tpl
注意
1. 所有的ng-model=dbparms.#的都是需要傳遞的參數,其對應於controller中scope.dbparms2.ngclick=searchparmsparms scope.search方法中switch一一對應
3. 表格字段的sort是排序的通用方法

固定的頭部

<div id="model.datatable" ng-controller="ItemCtrl">

</div>

搜索條件部分

<form novalidate
                name="myForm">
          <div class="search-condition-box">
            <div class="condition-tips">
              <label for="name">用戶名</label>
              <!--ng-class 當輸入的不正確時,給input添加一個紅色邊框-->
              <input  name="name"
                      ng-model="dbparms.name"
                      ng-class="{error:myForm.name.$dirty && myForm.name.$invalid}" 
                      ng-maxlength="5"
                      ng-minlength="3"
                      ng-pattern="/\w/"
                      type="text"
                      required />
                      <!--出現錯誤提示信息-->
              <!-- <span item-form-validate
                      ng-messages="myForm.name.$error"
                      ng-messages-multiple
                      ng-show="myForm.name.$dirty && myForm.name.$invalid">
              </span> -->
            </div>
            <div class="condition-tips">
              <label for="user">user</label>
              <input  name="user"
                      ng-model="dbparms.user"
                      type="text"/>
            </div>
            <div class="condition-tips">
              <button ng-disabled="myForm.$invalid" class="btn btn-info" ng-click="search('query')">查詢</button>
            </div>
          </div>
        </form>

table頭部(修改翻頁&操作按鈕)

注意:class=”ar “的均爲圖標,如需使用可參照http://chinakids.github.io/Art-Reactor/dome/index.html

<div class="box-header table-header">
            <h3 class="box-title">
              <span class="ar ar-list-ulb"></span>這是我的表格
            </h3>
            <div class="pull-right">
              <div class="dataTables_length">
                <label>每頁
                  <select class="form-control input-sm" 
                          ng-model="dbparms.pagesize" 
                          ng-options="(page+'條') for page in dbparms.pagelist" 
                          ng-change="search()">
                  </select>
                </label>
              </div>
              <div class="btn-group">
                <a href="#model/myItem" class="btn btn-default btn-sm" title="新增" >
                  <i class="ar ar-zoom-in"></i>
                </a>
                <a class="btn btn-default btn-sm" title="刪除" >
                  <i class="ar ar-delete"></i>
                </a>
                <a class="btn btn-default btn-sm" title="修改">
                  <i class="ar ar-edit-now"></i>
                </a>
                <a class="btn btn-default btn-sm" title="導出Excel">
                  <i class="ar ar-download-b"></i>
                </a>
              </div><!-- /.btn-group -->
            </div><!-- /.pull-right -->
          </div><!-- /.box-header -->

table數據部分

注意:sort方法與ng-class(default不排序狀態,desc向下箭頭,asc向上箭頭)

<div class="table-responsive mailbox-messages">
            <table class="table table-bordered table-striped dataTable" role="grid" aria-describedby="example1_info">
              <thead>
                <tr class="row">
                  <th class="checkAll"><input ng-click="checkAll()" type="checkbox">全選</th>

                  <th ng-click="sort('name')">NAME
                    <span ng-class="{'default': 'glyphicon glyphicon-sort', 'desc': 'ar ar-triangle-down','asc':'ar ar-triangle-up'}[name]"></span>
                  </th>
                  <th ng-click="sort('team')">TEAM
                    <span ng-class="{'default': 'glyphicon glyphicon-sort', 'desc': 'ar ar-triangle-down','asc':'ar ar-triangle-up'}[team]"></span>
                  </th >

                  <th ng-click="sort('retire')">RETIRE
                    <span ng-class="{'default': 'glyphicon glyphicon-sort', 'desc': 'ar ar-triangle-down','asc':'ar ar-triangle-up'}[retire]"></span>
                  </th>
                  <th>EDIT</th>
                </tr>
              </thead>
              <tbody>
                <tr class="row" ng-repeat="list in model.lists">
                  <td ><input name='checkname' class="inChecked" type="checkbox"></td>
                  <td >{{list.name}}</td>
                  <td >{{list.team}}</td>
                  <td >{{list.retire}}</td>
                  <td>
                    <a class="btn btn-primary btn-xs" href="#model/myItem" type="button"><i class="ar ar-zoom-in"></i></a>
                    <a class="btn btn-primary btn-xs" href="#model/myItemUpdate" type="button"><i class="ar ar-edit-now"></i></a>
                    <a class="btn btn-warning btn-xs" ng-click="model.delete($index)" type="button"><i class="ar ar-delete"></i></a>
                  </td>
                </tr>
              </tbody>
            </table><!-- /.table -->
          </div><!-- /.mail-box-messages -->

table翻頁

注意:這裏多處使用ng-disabled來做一些簡單的邏輯判斷,減少腳本中的邏輯判斷,如需修改,請慎重。

<div class="row footer-paginate">
            <div class="col-sm-12">
              <div class="col-sm-8">
                <div class="dataTables_paginate paging_simple_numbers">
                  <ul class="pagination">
                    <li class="paginate_button first" >
                      <button ng-click="search('first')" ng-disabled="dbparms.curpage==1">首頁</button>
                    </li>
                    <li class="paginate_button" >
                      <button ng-click="search('pre')" ng-disabled="dbparms.curpage==1">上一頁</button>
                    </li>
                    <li class="paginate_button">
                      <button>{{dbparms.curpage}}/{{dbparms.totalpages}}</button>
                    </li>
                    <li class="paginate_button">
                      <button ng-click="search('next')" ng-disabled="dbparms.curpage==dbparms.totalpages">下一頁</button>
                    </li>
                    <li class="paginate_button next">
                      <button ng-click="search('last')" ng-disabled="dbparms.curpage==dbparms.totalpages">尾頁</button>
                    </li>
                    <li>
                      <input type="number" ng-model="dbparms.pages">
                      <button class="btn btn-info btn-flat" ng-disabled="dbparms.pages<1||dbparms.pages>dbparms.totalpages" ng-click="search('page')">Go</button>
                    </li>
                  </ul>
                </div>
              </div>
              <div class="col-sm-4">
                <div class="dataTables_info" role="status" aria-live="polite">共有<span>{{dbparms.totaldatas}}</span>條記錄
                </div>
              </div>
            </div>
          </div>

js腳本

腳本中主要是一些方法,在實際中,請根據需要進行修改(注意,在修改$scope.dbparms時,需同步修改tpl中與之對應的字段),詳細請查看fdc_smartplatform\app\js\model\datatable.js

固定的部分

(function (factory) {
  if (typeof define === 'function' && define.amd) {
    define([
      'angular','directives'
    ], factory);
  } else {
    factory(window.jQuery);
  }
})(function(angular){
  var init = function(wrap, params, tplPanel) {
    wrap.html(tplPanel());

    var itemApp = angular.module('itemApp',['fdcDirectives']);
    itemApp.controller('ItemCtrl', ['$scope', '$http', function($scope, $http){

    }]);     
    angular.bootstrap(document.getElementById('model.datatable'), ['itemApp']);
  }
  return {
    init: init
  };
});

$scope.dbparms 參數

注意:主要是table相關的一些參數,此例中也是向後臺請求數據的參數

$scope.dbparms={
          // 頁面上的查詢條件
          name:null,
          tel:null,
          startdate:null,
          enddate:null,
          number:[{
              key:"22",
              value:"22"
            },{
              key:"23",
              value:"23"
            },{
              key:"24",
              value:"24"
            }
          ],
          user:null,
          ordername:null,  //排序的字段
          ordertype:null,  //排序的方式 正序(asc) 還是倒序(desc)

          // table自身需要的一些條件
          curpage:1,      //當前是第多少頁
          totalpages:12,  //總共多少頁
          pages:null,     //輸入即將查詢的頁碼
          totaldatas:null,//總共多少條數據
          pagesize:10,     //每頁顯示多少條數據
          pagelist:[5,10,15,20,25]//預定義的頁碼數組 這個可以進行抽離
        }

$scope.model 基本操作

注意頁面中對table數據的一些基本操作,開發中此部分需進行完善

$scope.model = {
          lists: null,
          create: function(){
            window.location.href = '#myItem?type=new';
          },
          update: function(id){
             window.location.href = '#myItem?type=edit&id=' + id;
          },
          delete: function(index){
            var msg = this.lists[index].name;
            msg = 'Sure to delete this record: ' + msg;  
            tool.confirm(msg, function(){
              $scope.model.lists.splice(index,1);
              $scope.$apply($scope.model);
            });
          }
        };

請求後臺數據

注意:這個務必封裝成一個方法,整個controller中可進行重複調用

 /**
         * 20151217 查詢數據 詹順懷
         * @param  {[obj]} parms [查詢數據所需的參數]
         * @return {[type]}       [將新獲取得數據重新渲染在頁面上]
         */
        var getData=function(parms){
          console.log(parms);
          $http.get('tempdata/table.json',parms).success(function(res){
              $scope.model.lists = res.data;
              $scope.dbparms.totaldatas = res.totaldata;
              $scope.dbparms.totalpages = res.totalpages;
              $scope.dbparms.pages=null;
              // $scope.apply($scope.model.lists);
          });
        }

search 查詢

/**
         * 20151217 查詢&分頁 詹順懷
         *  按照條件查詢(query) 
         *  分頁(首頁[first]、上一頁[pre]、下一頁[next]、尾頁[last] Go(page)) 
         *  修改每頁顯示多少條數據 undefined
         * @param  {[type]} parms [當前點擊的是那個按鈕]
         * @return {[type]}       [更新請求參數,重新向後臺請求數據]
         */
        $scope.search=function(parms){
          switch(parms){
            case 'query':
            case 'first':
              $scope.dbparms.curpage =1;
              break;
            case 'pre':
              $scope.dbparms.curpage -=1;
              break;
            case 'next':
              $scope.dbparms.curpage +=1;
              break;
            case 'last':
              $scope.dbparms.curpage =$scope.dbparms.totalpages;
              break;
            case 'page':
              $scope.dbparms.curpage =$scope.dbparms.pages;
              break;
            default:
              console.log($scope.dbparms.pagesize);
              break;
          }
          //重新傳參 請求數據
          getData($scope.dbparms)
        }

sort 排序

        //20151217 table排序 詹順懷
        //頁面上那些字段需要排序
        var headtitles=['name','team','retire'];
        for(var i=0;i<headtitles.length;i++){
          $scope[headtitles[i]]='default';
        }
        // 默認以什麼字段排序 例如以name 倒序
        // $scope.name='desc';
        $scope.sort=function(fieldName){
          for(var i =0;i<headtitles.length;i++){
            if(fieldName!=headtitles[i]){
              $scope[headtitles[i]]='default'
            }else{
              var s=$scope[fieldName];
              switch(s){
                case 'default':
                case 'asc':
                  $scope[fieldName]='desc';
                  break;
                case 'desc':
                  $scope[fieldName]='asc';
                  break;
                default:
                  break;
              }
            }
          }
          $scope.dbparms.ordername = fieldName;
          $scope.dbparms.ordertype = $scope[fieldName];
          //重新傳參 請求數據
          getData($scope.dbparms);
        };
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章