Angular uib-pagination
を使用するアプリケーションでページ分割を維持しようとしています。これを行う適切な方法を取得できません。
HTML
<table id="mytable" class="table table-striped">
<thead>
<tr class="table-head">
<th>Name</th>
</tr>
</thead>
<tbody>
<tr ng-repeat="person in aCandidates">
<th>
<div>{{person}}</div>
</th>
</tr>
</tbody>
</table>
コントローラ
$scope.totalItems = $scope.aCandidates.length;
$scope.currentPage = 1;
$scope.itemsPerPage = 10;
ページネーションバーを表示できますが、それでアクションが実行されず、total-itemsを10に設定しても、テーブルデータ全体がレンダリングされます。
Uib-paginationがどのように正確に機能し、データ(この場合はaCandidates
)がページネーションにリンクされているか。
欠けているのは、配列全体から現在のページのデータを取得する関数が必要なことです。これを処理するためにsetPagingData()
という関数を追加しました。
これは、フォークされた plunker で確認できます。
var app = angular.module("plunker", ["ui.bootstrap"]);
app.controller("MainCtrl", function($scope) {
var allCandidates =
["name1", "name2", "name3", "name4", "name5",
"name6", "name7", "name8", "name9", "name10",
"name11", "name12", "name13", "name14", "name15",
"name16", "name17", "name18", "name19", "name20"
];
$scope.totalItems = allCandidates.length;
$scope.currentPage = 1;
$scope.itemsPerPage = 5;
$scope.$watch("currentPage", function() {
setPagingData($scope.currentPage);
});
function setPagingData(page) {
var pagedData = allCandidates.slice(
(page - 1) * $scope.itemsPerPage,
page * $scope.itemsPerPage
);
$scope.aCandidates = pagedData;
}
});
<link data-require="bootstrap-css@*" data-semver="4.0.0-alpha.2" rel="stylesheet" href="https://maxcdn.bootstrapcdn.com/bootstrap/4.0.0-alpha.2/css/bootstrap.min.css" />
<script>document.write('<base href="' + document.location + '" />');</script>
<script data-require="[email protected]" src="https://code.angularjs.org/1.4.9/angular.js" data-semver="1.4.9"></script>
<script data-require="ui-bootstrap@*" data-semver="1.3.2" src="https://cdn.rawgit.com/angular-ui/bootstrap/gh-pages/ui-bootstrap-tpls-1.3.2.js"></script>
<div ng-app="plunker">
<div ng-controller="MainCtrl">
<table id="mytable" class="table table-striped">
<thead>
<tr class="table-head">
<th>Name</th>
</tr>
</thead>
<tbody>
<tr ng-repeat="person in aCandidates">
<th>
<div>{{person}}</div>
</th>
</tr>
</tbody>
</table>
<uib-pagination total-items="totalItems" ng-model="currentPage" items-per-page="itemsPerPage"></uib-pagination>
</div>
</div>
新しいバージョンの場合は、次のコードに変更してください:
<ul uib-pagination total-items="totalItems" ng-model="currentPage" items-per-page="itemsPerPage"></ul>
<uib-pagination>
タグはサポートされなくなりました。属性として指定する必要があります。
Angular-2
を使用している場合は、- ngx-bootstrap を試すことができます。 Angular-2
と統合できる多数のbootstrapコンポーネントがあります
Ngx-bootstrapをインストールしたら、次を試してください
あなたのhtmlテンプレート| pagination.html
<div class="row">
<div class="col-xs-12 col-12">
<pagination [totalItems]="totalItems" [(ngModel)]="currentPage" [maxSize]="maxSize" class="pagination-sm"
[boundaryLinks]="true"></pagination>
</div>
</div>
コンポーネント| pagination-component.ts
import { Component } from '@angular/core';
@Component({
selector: 'demo-pagination',
templateUrl: './pagination.html'
})
export class DemoPagination {
maxSize: number = 5;
totalItems: number = 175;
currentPage: number = 1;
numPages: number = 0;
pageChanged(event: any): void {
console.log('Page changed to: ' + event.page);
console.log('Number items per page: ' + event.itemsPerPage);
}
}
これは次のようになります