如何告诉ui-Bootstrap要分页的内容?

时间:2014-05-14 11:29:29

标签: angularjs twitter-bootstrap pagination angular-ui-bootstrap

我正在使用ui-Bootstrap,我正在努力让分页工作,但我似乎错过了一些东西。我已阅读文档并查看了一堆掠夺者,试图找出他们如何指定要分页的内容,但我没有运气。

以下是我所做的http://plnkr.co/edit/5mfiAcOaGw8z8VinhIQo?p=preview

<section class="main" ng-controller="contentCtrl">
  <div ng-repeat="friend in friends">
    {{friend.name}}
  </div>
  <pagination total-items="totalItems" items-per-page="itemsPerPage" ng-model="currentPage" ng-change="pageChanged()"></pagination>

  <p>
    total Items: {{totalItems}}<br />
    Items per page: {{itemsPerPage}}<br />
    Current Page: {{currentPage}}
  </p>
</section>

控制器:

angular.module('plunker', ['ui.bootstrap'])
  .controller('contentCtrl', function ($scope) {

    $scope.friends = [
      {'name':'Jack'},
      {'name':'Tim'},
      {'name':'Stuart'},
      {'name':'Richard'},
      {'name':'Tom'},
      {'name':'Frank'},
      {'name':'Ted'},
      {'name':'Michael'},
      {'name':'Albert'},
      {'name':'Tobby'},
      {'name':'Mick'},
      {'name':'Nicholas'},
      {'name':'Jesse'},
      {'name':'Lex'},
      {'name':'Robbie'},
      {'name':'Jake'},
      {'name':'Levi'},
      {'name':'Edward'},
      {'name':'Neil'},
      {'name':'Hugh'},
      {'name':'Hugo'},
      {'name':'Yanick'},
      {'name':'Matt'},
      {'name':'Andrew'},
      {'name':'Charles'},
      {'name':'Oliver'},
      {'name':'Robin'},
      {'name':'Harry'},
      {'name':'James'},
      {'name':'Kelvin'},
      {'name':'David'},
      {'name':'Paul'}
    ];

    $scope.totalItems = 64;
    $scope.itemsPerPage = 10
    $scope.currentPage = 1;

    $scope.setPage = function (pageNo) {
      $scope.currentPage = pageNo;
    };

    $scope.pageChanged = function() {
      console.log('Page changed to: ' + $scope.currentPage);
    };

    $scope.maxSize = 5;
    $scope.bigTotalItems = 175;
    $scope.bigCurrentPage = 1;
  });

4 个答案:

答案 0 :(得分:25)

我可以简单地添加以下引用:

  1. bootstrap-css
  2. angular.js
  3. 角-UI-自举
  4. 你的身体看起来像这样:

    <html ng-app="friends"> 
    <head>
    ...
    </head>
    <body>
       <h4>Paginated Friends</h4>
       <section class="main" ng-controller="contentCtrl">
          <div ng-repeat="friend in filteredFriends">
             {{friend.name}}
          </div>
          <pagination total-items="totalItems" items-per-page="itemsPerPage" 
             ng-model="currentPage" ng-change="pageChanged()"></pagination>
          <p>
             Total items: {{totalItems}}<br />
             Items per page: {{itemsPerPage}}<br />
             Current Page: {{currentPage}}
          </p>
       </section>
    </body>
    </html>
    

    然后定义以下控制器:

    var app = angular.module('plunker', ['ngResource', 'ui.bootstrap']);
    
    app.factory('friendsFactory', function($resource) {
      return $resource('friends.json');
    });
    
    app.controller('contentCtrl', function ($scope, friendsFactory) {
      $scope.friends = friendsFactory.query();
    
      $scope.itemsPerPage = 10
      $scope.currentPage = 1;
    
      // $scope.maxSize = 5;
      // $scope.bigTotalItems = 175;
      // $scope.bigCurrentPage = 1;
    
      $scope.pageCount = function () {
        return Math.ceil($scope.friends.length / $scope.itemsPerPage);
      };
    
      $scope.friends.$promise.then(function () {
        $scope.totalItems = $scope.friends.length;
        $scope.$watch('currentPage + itemsPerPage', function() {
          var begin = (($scope.currentPage - 1) * $scope.itemsPerPage),
            end = begin + $scope.itemsPerPage;
    
          $scope.filteredFriends = $scope.friends.slice(begin, end);
        });
      });
    });
    

答案 1 :(得分:1)

ui-bootstrap 0.10不使用ng-model更新当前页面。

使用page="currentPage"显示当前页面。

使用on-select-page="setPage(page)"更改当前页面。

示例在这里:

http://plnkr.co/edit/UIWIeDSKIK4bG96eoJmt?p=preview

如果你想使用ng-model。将您的ui-bootstrap版本更新为0.11

答案 2 :(得分:1)

您可以使用ng-repeat中创建的变量。这有效。我一直使用它,直到我不得不改变它。

ng-repeat="friend in friends.slice(((currentPage-1)*itemsPerPage), ((currentPage)*itemsPerPage)) track by $index"

但是我发现这个问题的最佳解决方案是创建一个过滤器并将其链接起来。把它放在链的最后,因为你可能想在它之前使用其他过滤器。以下是使用orderby过滤器的示例。不同的是,您可以订购整个阵列,然后分页并显示您想要显示的部分。

function paginateFilter() {
  return function (friends, currentPage, itemsPerPage) {
    var filteredFlowers = flowers.slice(((currentPage-1)*itemsPerPage), ((currentPage)*itemsPerPage))
    return filteredFriends;
  };
}

这是html。您将不得不使用具有多个变量的过滤器。

ng-repeat="friend in main.friends |orderBy: 'name' | paginate: main.currentPage: main.itemsPerPage">

其中main是控制器的名称。

答案 3 :(得分:0)

使用angularjs 1.5组件和Typescript

实现

searchresults.controller.ts

import {Group as Groups, GroupSearchCriteria as GroupsSearchCriteria, GroupSearchResults as GroupsSearchResults } from "../../models/Groups";
import GroupsService from "groups/groups.service";

interface ISearchResultsController {
    groups: Groups[];
    groupsSearchCriteria: GroupsSearchCriteria;
    pageChanged(): void;
    splitGroupsPagination(): void;
  }

class SearchResultsController implements ISearchResultsController {

    groups: Groups[];
    groupsSearchCriteria: GroupsSearchCriteria;
    groupresSearchCriteria: any;
    TotalResults: any;
    CurrentPage: any;
    ResultsPerPage: any;
    pageCount: number;
    begin: number;
    end: number;
    sortedResults: Groups[];

           constructor(private groupsService: GroupsService, private groupSearchResults: GroupsSearchResults) {
        var isolatedScopeSearchResults = this;
        this.groups = isolatedScopeSearchResults.groupsService.searchCallback.SearchResults;
        this.groupresSearchCriteria = isolatedScopeSearchResults.groupsService.searchCallback.Criteria;
        this.TotalResults = 7;
        this.CurrentPage = 1;
        this.ResultsPerPage = 5;
    }

    $onInit() {
        this.splitGroupsPagination();
    }

    splitGroupsPagination() {
        this.pageCount = Math.ceil(this.TotalResults / this.ResultsPerPage);
        this.begin = ((this.CurrentPage - 1) * this.ResultsPerPage);
        this.end = this.begin + this.ResultsPerPage;
        this.sortedResults = this.groups.slice(this.begin, this.end);
    }

    pageChanged() {
        this.splitGroupsPagination();
    }
}

export default SearchResultsController;

searchresults.component.ts

    import SearchResultsController from "./searchresults.controller";

    class SearchResultsComponent implements ng.IComponentOptions {
        template = `


    <div id="groupSearchResults" class="box-response">
      <!-- start: results header with btn add-->
        <div class="box-header">
            <h2><span>Search Results: </span><span>{{$ctrl.groups.length}}</span> <span>Term: {{$ctrl.groupresSearchCriteria.SearchDescription}}</span></h2>
        </div>

        <div class="box-content">


    <table class="table table-bordered table-hover table-striped">
        <thead>
            <tr>
                <td>Name</td>
                <td>Id</td>
                <td>Consent Group</td>
                <td>Permitted Uris</td>
                <td>Actions</td>
            </tr>
        </thead>
        <tbody>
            <tr data-ng-repeat="group in $ctrl.sortedResults">
                <td>{{group.Name}}</td>
                <td>{{group.Id}}</td>
                <td>{{group.IncludeInConsentGroups}}</td>
                <td>{{group.PermittedUris}}</td>
                <td>
                   <a class="btn btn-success" href="" ui-sref="edit({editgroupId:group.Id})"><i class="fa fa-edit"></i></a>
                </td>
            </tr>
        </tbody>
    </table>

    </div>

  <uib-pagination total-items="$ctrl.TotalResults" ng-model="$ctrl.CurrentPage" items-per-page="$ctrl.ResultsPerPage" ng-change="$ctrl.pageChanged()"></uib-pagination>

    </div>


       `;

        controller = ['GroupsService',SearchResultsController];
    }

    export default SearchResultsComponent;