减少分页数

时间:2018-10-03 19:13:35

标签: html angularjs

我已经使用Materialize CSS和AngularJS构建了分页。参见下图。

enter image description here

我有一个控制器文件,其中包含一个对象数组,基于该对象可以确定页数。

Controller.js

app.controller("products", ["$scope", function($scope) {
    $scope.products = [{foo: 'bar'},{},{}..{}];
    $scope.currentPage = 0;
    $scope.pageSize = 10; // number of products to show on a page
    $scope.numberOfPages = Math.ceil($scope.prods.length/$scope.pageSize);
    $scope.pages = function(number) {
        return new Array(number);
    }
    $scope.setCurrentPage = function(index) {
        $scope.currentPage = index;
    }
}]);

HTML:

<ul class="pagination">
    <li ng-repeat="x in pages(numberOfPages) track by $index" ng-click="setCurrentPage($index)" ng-class="{ 'active': $index === currentPage }"><a href="#!">{{$index+1}}</a></li>
</ul>

现在,我希望分页像图像中显示的那样。第一个和最后一个页码始终保持可见,但是所选页码及其相邻页码仅可见。例如,对于2-> 1,2,3,对于7-> 6,7,8,依此类推。

请帮助。

1 个答案:

答案 0 :(得分:0)

我在下面提供了一个有效的代码段,但我将首先重点介绍它的重要方面。

通常的想法是使用ng-show来显示或隐藏分页小部件中的每个页面链接按钮部分。这样做的逻辑基于:链接表示的页面,当前页面和页面链接窗口的大小(在您的情况下,它仅仅是一个)。

唯一棘手的部分是您需要的这些椭圆。我的建议是将它们实现为伪元素。这些伪元素是根据CSS类的应用显示或隐藏的,这些CSS类只能应用于分页小部件的首页或末页链接项。

该示例是准系统,并去除与获取所需分页行为无关的所有内容。

angular
  .module('app', [])
  .controller('products', function ($scope) {
    $scope.currentPage = 0;
    $scope.pageCount = 100;
    $scope.pageLinkWindowSize = 1;
    $scope.pages = function (pageCount) {
      return new Array(pageCount);
    };
    $scope.setCurrentPage = function (index) {
      $scope.currentPage = index;
    };
    $scope.isPageLinkVisible = function (index) {
      if (index === 0 || index === $scope.pageCount - 1) {
        return true;
      } else {
        return index >= Math.max($scope.currentPage > $scope.pageCount - 1 - $scope.pageLinkWindowSize ? $scope.pageCount - 1 - $scope.pageLinkWindowSize * 2 : $scope.currentPage - $scope.pageLinkWindowSize, 0) &&
               index <= Math.min($scope.currentPage < $scope.pageLinkWindowSize ? $scope.pageLinkWindowSize * 2 : $scope.currentPage + $scope.pageLinkWindowSize, $scope.pageCount - 1);
      }
    };
    $scope.hasPagesAfter = function (index) {
      return index === 0 && ($scope.currentPage - $scope.pageLinkWindowSize) > 1;
    };
    $scope.hasPagesBefore = function (index) {
      return index === ($scope.pageCount - 1) && ($scope.pageCount - 1) - $scope.currentPage - $scope.pageLinkWindowSize > 1;
    };
  });
ul {
  list-style-type: none;
}
li {
  float: left;
  margin-right: 1em;
}
.pages-after::after {
  content: '...';
  display: inline;
  margin-left: 1em;
}
.pages-before::before {
  content: '...';
  display: inline;
  margin-right: 1em;
}
<div ng-app="app" ng-controller="products">
  <div>
    <label>
      Window Size
      <input type="number" ng-model="pageLinkWindowSize" min="1" />
    </label>
  </div>
  <ul>
    <li
      ng-repeat="page in pages(pageCount) track by $index"
      ng-click="setCurrentPage($index)"
      ng-show="isPageLinkVisible($index)"
      ng-class="{
        'pages-after': hasPagesAfter($index),
        'pages-before': hasPagesBefore($index),
      }">
      <a href="#!">{{ $index + 1 }}</a>
    </li>
  </ul>
</div>
<script src="https://unpkg.com/angular@1.7.4/angular.min.js"></script>