Angular Bootstrap pagination
<!--Pagination -->
<nav class="my-4">
<ul class="pagination pagination-circle pg-blue mb-0">
<!--First-->
<li class="page-item disabled"><a class="page-link" mdbWavesEffect>First</a></li>
<!--Arrow left-->
<li class="page-item disabled">
<a class="page-link" mdbWavesEffect aria-label="Previous">
<span aria-hidden="true">«</span>
<span class="sr-only">Previous</span>
</a>
</li>
<!--Numbers-->
<li class="page-item active"><a class="page-link" mdbWavesEffect>1</a></li>
<li class="page-item"><a class="page-link" mdbWavesEffect >2</a></li>
<li class="page-item"><a class="page-link" mdbWavesEffect >3</a></li>
<li class="page-item"><a class="page-link" mdbWavesEffect >4</a></li>
<li class="page-item"><a class="page-link" mdbWavesEffect >5</a></li>
<!--Arrow right-->
<li class="page-item">
<a class="page-link" mdbWavesEffect aria-label="Next">
<span aria-hidden="true">»</span>
<span class="sr-only">Next</span>
</a>
</li>
<!--First-->
<li class="page-item"><a class="page-link">Last</a></li>
</ul>
</nav>
<!--/Pagination -->
Basic examples
Simple pagination inspired by Rdio, great for apps and search results. The large block is hard to miss, easily scalable, and provides large click areas.
<nav>
<ul class="pagination">
<li class="page-item" >
<a class="page-link" mdbWavesEffect aria-label="Previous">
<span aria-hidden="true">«</span>
<span class="sr-only">Previous</span>
</a>
</li>
<li class="page-item" ><a class="page-link" mdbWavesEffect>1</a></li>
<li class="page-item" ><a class="page-link" mdbWavesEffect>2</a></li>
<li class="page-item" ><a class="page-link" mdbWavesEffect>3</a></li>
<li class="page-item" ><a class="page-link" mdbWavesEffect>4</a></li>
<li class="page-item" ><a class="page-link" mdbWavesEffect>5</a></li>
<li class="page-item" >
<a class="page-link" mdbWavesEffect aria-label="Next">
<span aria-hidden="true">»</span>
<span class="sr-only">Next</span>
</a>
</li>
</ul>
</nav>
Disabled and active states
Links are customizable for different circumstances. Use
.disabled
for unclickable links and
.active
to indicate the current page.
<nav>
<ul class="pagination pg-blue">
<li class="page-item disabled">
<a class="page-link" href="#" mdbWavesEffect aria-label="Previous">
<span aria-hidden="true">«</span>
<span class="sr-only">Previous</span>
</a>
</li>
<li class="page-item active">
<a class="page-link" mdbWavesEffect>1 <span class="sr-only">(current)</span></a>
</li>
<li class="page-item" ><a class="page-link" mdbWavesEffect>2</a></li>
<li class="page-item" ><a class="page-link" mdbWavesEffect>3</a></li>
<li class="page-item" ><a class="page-link" mdbWavesEffect>4</a></li>
<li class="page-item" ><a class="page-link" mdbWavesEffect>5</a></li>
<li class="page-item" >
<a class="page-link" mdbWavesEffect aria-label="Next">
<span aria-hidden="true">»</span>
<span class="sr-only">Next</span>
</a>
</li>
</ul>
</nav>
You can optionally swap out active or disabled anchors for
<span>
, or omit the anchor in the case of the prev/next arrows, to remove click functionality while
retaining intended styles.
<nav>
<ul class="pagination pg-blue">
<li class="page-item disabled">
<span class="page-link" aria-label="Previous">
<span aria-hidden="true">«</span>
<span class="sr-only">Previous</span>
</span>
</li>
<li class="page-item active">
<a class="page-link" mdbWavesEffect>1 <span class="sr-only">(current)</span></a>
</li>
</ul>
</nav>
Pagination color
<!--Pagination blue-->
<nav>
<ul class="pagination pg-blue">
<!--Arrow left-->
<li class="page-item">
<a class="page-link" mdbWavesEffect aria-label="Previous">
<span aria-hidden="true">«</span>
<span class="sr-only">Previous</span>
</a>
</li>
<!--Numbers-->
<li class="page-item active"><a class="page-link" mdbWavesEffect>1</a></li>
<li class="page-item"><a class="page-link" mdbWavesEffect>2</a></li>
<li class="page-item"><a class="page-link" mdbWavesEffect>3</a></li>
<li class="page-item"><a class="page-link" mdbWavesEffect>4</a></li>
<li class="page-item"><a class="page-link" mdbWavesEffect>5</a></li>
<!--Arrow right-->
<li class="page-item">
<a class="page-link" mdbWavesEffect aria-label="Next">
<span aria-hidden="true">»</span>
<span class="sr-only">Next</span>
</a>
</li>
</ul>
</nav>
<!--/Pagination blue-->
<!--Pagination red-->
<nav>
<ul class="pagination pg-red">
<!--Arrow left-->
<li class="page-item">
<a class="page-link" mdbWavesEffect aria-label="Previous">
<span aria-hidden="true">«</span>
<span class="sr-only">Previous</span>
</a>
</li>
<!--Numbers-->
<li class="page-item active"><a class="page-link" mdbWavesEffect>1</a></li>
<li class="page-item"><a class="page-link" mdbWavesEffect>2</a></li>
<li class="page-item"><a class="page-link" mdbWavesEffect>3</a></li>
<li class="page-item"><a class="page-link" mdbWavesEffect>4</a></li>
<li class="page-item"><a class="page-link" mdbWavesEffect>5</a></li>
<!--Arrow right-->
<li class="page-item">
<a class="page-link" mdbWavesEffect aria-label="Next">
<span aria-hidden="true">»</span>
<span class="sr-only">Next</span>
</a>
</li>
</ul>
</nav>
<!--/Pagination red-->
<!--Pagination teal-->
<nav>
<ul class="pagination pg-teal">
<!--Arrow left-->
<li class="page-item">
<a class="page-link" mdbWavesEffect aria-label="Previous">
<span aria-hidden="true">«</span>
<span class="sr-only">Previous</span>
</a>
</li>
<!--Numbers-->
<li class="page-item active"><a class="page-link" mdbWavesEffect>1</a></li>
<li class="page-item"><a class="page-link" mdbWavesEffect>2</a></li>
<li class="page-item"><a class="page-link" mdbWavesEffect>3</a></li>
<li class="page-item"><a class="page-link" mdbWavesEffect>4</a></li>
<li class="page-item"><a class="page-link" mdbWavesEffect>5</a></li>
<!--Arrow right-->
<li class="page-item">
<a class="page-link" mdbWavesEffect aria-label="Next">
<span aria-hidden="true">»</span>
<span class="sr-only">Next</span>
</a>
</li>
</ul>
</nav>
<!--/Pagination teal-->
<!--Pagination dark-->
<nav>
<ul class="pagination pg-dark">
<!--Arrow left-->
<li class="page-item">
<a class="page-link" mdbWavesEffect aria-label="Previous">
<span aria-hidden="true">«</span>
<span class="sr-only">Previous</span>
</a>
</li>
<!--Numbers-->
<li class="page-item active"><a class="page-link" mdbWavesEffect>1</a></li>
<li class="page-item"><a class="page-link" mdbWavesEffect>2</a></li>
<li class="page-item"><a class="page-link" mdbWavesEffect>3</a></li>
<li class="page-item"><a class="page-link" mdbWavesEffect>4</a></li>
<li class="page-item"><a class="page-link" mdbWavesEffect>5</a></li>
<!--Arrow right-->
<li class="page-item">
<a class="page-link" mdbWavesEffect aria-label="Next">
<span aria-hidden="true">»</span>
<span class="sr-only">Next</span>
</a>
</li>
</ul>
</nav>
<!--/Pagination dark-->
<!--Pagination blue grey-->
<nav>
<ul class="pagination pg-bluegrey">
<!--Arrow left-->
<li class="page-item">
<a class="page-link" mdbWavesEffect aria-label="Previous">
<span aria-hidden="true">«</span>
<span class="sr-only">Previous</span>
</a>
</li>
<!--Numbers-->
<li class="page-item active"><a class="page-link" mdbWavesEffect>1</a></li>
<li class="page-item"><a class="page-link" mdbWavesEffect>2</a></li>
<li class="page-item"><a class="page-link" mdbWavesEffect>3</a></li>
<li class="page-item"><a class="page-link" mdbWavesEffect>4</a></li>
<li class="page-item"><a class="page-link" mdbWavesEffect>5</a></li>
<!--Arrow right-->
<li class="page-item">
<a class="page-link" mdbWavesEffect aria-label="Next">
<span aria-hidden="true">»</span>
<span class="sr-only">Next</span>
</a>
</li>
</ul>
</nav>
<!--/Pagination grey-->
<!--Pagination amber-->
<nav>
<ul class="pagination pg-amber">
<!--Arrow left-->
<li class="page-item">
<a class="page-link" mdbWavesEffect aria-label="Previous">
<span aria-hidden="true">«</span>
<span class="sr-only">Previous</span>
</a>
</li>
<!--Numbers-->
<li class="page-item active"><a class="page-link" mdbWavesEffect>1</a></li>
<li class="page-item"><a class="page-link" mdbWavesEffect>2</a></li>
<li class="page-item"><a class="page-link" mdbWavesEffect>3</a></li>
<li class="page-item"><a class="page-link" mdbWavesEffect>4</a></li>
<li class="page-item"><a class="page-link" mdbWavesEffect>5</a></li>
<!--Arrow right-->
<li class="page-item">
<a class="page-link" mdbWavesEffect aria-label="Next">
<span aria-hidden="true">»</span>
<span class="sr-only">Next</span>
</a>
</li>
</ul>
</nav>
<!--/Pagination amber-->
<!--Pagination purple-->
<nav>
<ul class="pagination pg-purple">
<!--Arrow left-->
<li class="page-item">
<a class="page-link" mdbWavesEffect aria-label="Previous">
<span aria-hidden="true">«</span>
<span class="sr-only">Previous</span>
</a>
</li>
<!--Numbers-->
<li class="page-item active"><a class="page-link" mdbWavesEffect>1</a></li>
<li class="page-item"><a class="page-link" mdbWavesEffect>2</a></li>
<li class="page-item"><a class="page-link" mdbWavesEffect>3</a></li>
<li class="page-item"><a class="page-link" mdbWavesEffect>4</a></li>
<li class="page-item"><a class="page-link" mdbWavesEffect>5</a></li>
<!--Arrow right-->
<li class="page-item">
<a class="page-link" mdbWavesEffect aria-label="Next">
<span aria-hidden="true">»</span>
<span class="sr-only">Next</span>
</a>
</li>
</ul>
</nav>
<!--/Pagination purple-->
<!--Pagination dark grey-->
<nav>
<ul class="pagination pg-darkgrey">
<!--Arrow left-->
<li class="page-item">
<a class="page-link" mdbWavesEffect aria-label="Previous">
<span aria-hidden="true">«</span>
<span class="sr-only">Previous</span>
</a>
</li>
<!--Numbers-->
<li class="page-item active"><a class="page-link" mdbWavesEffect>1</a></li>
<li class="page-item"><a class="page-link" mdbWavesEffect>2</a></li>
<li class="page-item"><a class="page-link" mdbWavesEffect>3</a></li>
<li class="page-item"><a class="page-link" mdbWavesEffect>4</a></li>
<li class="page-item"><a class="page-link" mdbWavesEffect>5</a></li>
<!--Arrow right-->
<li class="page-item">
<a class="page-link" mdbWavesEffect aria-label="Next">
<span aria-hidden="true">»</span>
<span class="sr-only">Next</span>
</a>
</li>
</ul>
</nav>
<!--/Pagination dark grey-->
Sizing
Fancy larger or smaller pagination? Add
.pagination-lg
or
.pagination-sm
for additional sizes.
Large
<nav>
<ul class="pagination pagination-lg">
<li class="page-item">
<a class="page-link" mdbWavesEffect aria-label="Previous">
<span aria-hidden="true">«</span>
<span class="sr-only">Previous</span>
</a>
</li>
<li class="page-item"><a class="page-link" mdbWavesEffect>1</a></li>
<li class="page-item"><a class="page-link" mdbWavesEffect>2</a></li>
<li class="page-item"><a class="page-link" mdbWavesEffect>3</a></li>
<li class="page-item">
<a class="page-link" mdbWavesEffect aria-label="Next">
<span aria-hidden="true">»</span>
<span class="sr-only">Next</span>
</a>
</li>
</ul>
</nav>
Small
<nav>
<ul class="pagination pagination-sm">
<li class="page-item">
<a class="page-link" mdbWavesEffect aria-label="Previous">
<span aria-hidden="true">«</span>
<span class="sr-only">Previous</span>
</a>
</li>
<li class="page-item"><a class="page-link" mdbWavesEffect>1</a></li>
<li class="page-item"><a class="page-link" mdbWavesEffect>2</a></li>
<li class="page-item"><a class="page-link" mdbWavesEffect>3</a></li>
<li class="page-item">
<a class="page-link" mdbWavesEffect aria-label="Next">
<span aria-hidden="true">»</span>
<span class="sr-only">Next</span>
</a>
</li>
</ul>
</nav>
Usage - basic example
Simple usage example with only 3 pages. This example shows how you can use our pagination in your projects.
<main class="container-fluid">
<h1 class="h1-responsive text-center my-5">MDB Angular Pagination - basic</h1>
<!--Pagination -->
<nav class="my-4">
<ul class="d-flex justify-content-center pagination pagination-circle pg-blue mb-0">
<!--First-->
<li class="page-item">
<a class="page-link" mdbWavesEffect (click)="firstPage()">First</a>
</li>
<!--Numbers-->
<li #pages *ngFor="let page of pageCount" class="page-item">
<a class="page-link" mdbWavesEffect>{{page}}</a>
</li>
<!--Last-->
<li class="page-item">
<a class="page-link" mdbWavesEffect (click)="lastPage()">Last</a>
</li>
</ul>
</nav>
<!--/Pagination -->
<div class="row my-5">
<div class="col-md-6 mx-auto my-5">
<table class="table table-bordered">
<thead>
<tr>
<th class="col-1">ID</th>
<th class="col-11">Title</th>
</tr>
</thead>
<tbody>
<tr *ngFor="let post of allPosts">
<th *ngIf="post.id >= first && post.id <= last" scope="row">{{post.id}}</th>
<td *ngIf="post.id >= first && post.id <= last">{{post.title}}</td>
</tr>
</tbody>
</table>
</div>
</div>
</main>
import { Component, ViewChildren, QueryList, ElementRef, HostListener, Renderer2, AfterViewInit } from '@angular/core';
@Component({
selector: 'app-pagination',
templateUrl: './pagination.component.html',
styleUrls: ['./pagination.component.scss']
})
export class PaginationComponent implements AfterViewInit {
@ViewChildren('pages') pages: QueryList<ElementRef>;
allPosts = [
{ id: 1, title: 'Post 1' },
{ id: 2, title: 'Post 2' },
{ id: 3, title: 'Post 3' },
{ id: 4, title: 'Post 4' },
{ id: 5, title: 'Post 5' },
{ id: 6, title: 'Post 6' },
{ id: 7, title: 'Post 7' },
{ id: 8, title: 'Post 8' },
{ id: 9, title: 'Post 9' },
{ id: 10, title: 'Post 10' },
{ id: 11, title: 'Post 11' },
{ id: 12, title: 'Post 12' }
];
activePage = 1;
pageCount: Array<any> = [1, 2, 3];
first = 1;
last = 4;
@HostListener('click', ['$event']) onclick(event: any) {
if (event.target.parentElement.innerText >= 1 || event.target.parentElement.innerText <= 3) {
(this.activePage as number) = +event.target.parentElement.innerText;
this.clearActive();
this.renderer.addClass(event.target.parentElement, 'active');
}
this.first = +this.activePage * 4 - 4 + 1;
this.last = +this.activePage * 4;
}
constructor(private renderer: Renderer2, private el: ElementRef) { }
ngAfterViewInit() {
this.clearActive();
this.renderer.addClass(this.pages.first.nativeElement, 'active');
this.activePage = 1;
this.first = +this.activePage * 4 - 4 + 1;
this.last = +this.activePage * 4;
}
clearActive() {
this.pages.forEach(element => {
this.renderer.removeClass(element.nativeElement, 'active');
});
}
firstPage() {
this.clearActive();
const firstPage = this.pages.first.nativeElement;
console.log(firstPage);
(this.activePage as number) = +firstPage.innerText;
this.clearActive();
this.renderer.addClass(firstPage, 'active');
this.first = +this.activePage * 4 - 4 + 1;
this.last = +this.activePage * 4;
}
lastPage() {
this.clearActive();
const lastPage = this.pages.last.nativeElement;
(this.activePage as number) = +lastPage.innerText;
this.clearActive();
this.renderer.addClass(lastPage, 'active');
this.first = +this.activePage * 4 - 4 + 1;
this.last = +this.activePage * 4;
}
}
Usage - advanced example
Advanced example with previous / next page and first / last page buttons.
<main class="container mx-auto text-center ">
<h1 class="h1-responsive text-center my-5">
MDB Angular Pagination - Advanced usage
</h1>
<div class="row">
<div class="col-md-6 mx-auto mt-5">
<nav class="d-flex justify-content-center my-4 mx-auto text-center">
<ul class="pagination pagination-circle pg-blue mb-0 text-center">
<!--First-->
<li class="page-item">
<a class="page-link" mdbWavesEffect (click)="firstPage()">First</a>
</li>
<li #prev class="page-item">
<button type="button" class="page-link" mdbWavesEffect aria-label="Previous" (click)="prevPage($event)">«</button>
</li>
<li #pages *ngFor="let pageItem of pagination" class="page-item paginator">
<span>
<a class="page-link" (click)="clearActive()" mdbWavesEffect>{{pageItem}}</a>
</span>
</li>
<li #next class="page-item">
<button class="page-link" mdbWavesEffect aria-label="Next" (click)="nextPage($event)">»</button>
</li>
<!--Last-->
<li class="page-item">
<a class="page-link" (click)="lastPage()" mdbWavesEffect>Last</a>
</li>
</ul>
</nav>
</div>
</div>
<div class="row">
<div class="col-md-6 mx-auto">
<table class="table table-bordered">
<thead>
<tr>
<th class="col-1">ID</th>
<th class="col-11">Title</th>
</tr>
</thead>
<tbody>
<tr *ngFor="let post of data">
<th *ngIf="post.id >= firstElement && post.id <= lastElement" scope="row">{{post.id}}</th>
<td *ngIf="post.id >= firstElement && post.id <= lastElement">{{post.title}}</td>
</tr>
</tbody>
</table>
</div>
</div>
</main>
import { Component, OnInit, AfterContentChecked, AfterViewInit, QueryList, ElementRef, ViewChildren, HostListener, Renderer2, ViewChild } from '@angular/core';
@Component({
selector: 'app-pagination-advanced',
templateUrl: './pagination-advanced.component.html',
styleUrls: ['./pagination-advanced.component.scss']
})
export class PaginationAdvancedComponent implements AfterViewInit, OnInit, AfterContentChecked {
@ViewChildren('pages') pages: QueryList<ElementRef>;
@ViewChild('next') next: ElementRef;
@ViewChild('prev') prev: ElementRef;
data: any = [
{ id: 1, title: 'item 1' },
{ id: 2, title: 'item 2' },
{ id: 3, title: 'item 3' },
{ id: 4, title: 'item 4' },
{ id: 5, title: 'item 5' },
{ id: 6, title: 'item 6' },
{ id: 7, title: 'item 7' },
{ id: 8, title: 'item 8' },
{ id: 9, title: 'item 9' },
{ id: 10, title: 'item 10' },
{ id: 11, title: 'item 11' },
{ id: 12, title: 'item 12' },
{ id: 13, title: 'item 13' },
{ id: 14, title: 'item 14' },
{ id: 15, title: 'item 15' },
{ id: 16, title: 'item 16' },
{ id: 17, title: 'item 17' },
{ id: 18, title: 'item 18' },
{ id: 19, title: 'item 19' },
{ id: 20, title: 'item 20' },
{ id: 21, title: 'item 21' },
{ id: 22, title: 'item 22' },
{ id: 23, title: 'item 23' },
{ id: 24, title: 'item 24' },
{ id: 25, title: 'item 25' },
{ id: 26, title: 'item 26' },
{ id: 27, title: 'item 27' },
{ id: 28, title: 'item 28' },
{ id: 29, title: 'item 29' },
{ id: 30, title: 'item 30' },
{ id: 31, title: 'item 31' },
{ id: 32, title: 'item 32' },
{ id: 33, title: 'item 33' },
{ id: 34, title: 'item 34' },
{ id: 35, title: 'item 35' },
{ id: 36, title: 'item 35' },
{ id: 37, title: 'item 35' },
{ id: 38, title: 'item 35' },
{ id: 39, title: 'item 35' },
{ id: 40, title: 'item 35' },
{ id: 41, title: 'item 35' },
{ id: 42, title: 'item 35' },
{ id: 43, title: 'item 35' },
{ id: 44, title: 'item 35' },
{ id: 45, title: 'item 35' },
{ id: 46, title: 'item 35' },
{ id: 47, title: 'item 35' },
{ id: 48, title: 'item 35' },
{ id: 49, title: 'item 35' },
{ id: 50, title: 'item 35' },
{ id: 51, title: 'item 35' },
{ id: 52, title: 'item 35' },
{ id: 53, title: 'item 35' },
{ id: 54, title: 'item 35' },
{ id: 55, title: 'item 35' },
{ id: 56, title: 'item 35' },
{ id: 57, title: 'item 35' },
{ id: 58, title: 'item 35' },
{ id: 59, title: 'item 35' },
{ id: 60, title: 'item 35' },
{ id: 61, title: 'item 35' },
{ id: 62, title: 'item 35' },
{ id: 63, title: 'item 35' },
{ id: 64, title: 'item 35' },
{ id: 65, title: 'item 35' },
{ id: 66, title: 'item 35' },
{ id: 67, title: 'item 35' },
{ id: 68, title: 'item 35' },
{ id: 69, title: 'item 35' },
{ id: 70, title: 'item 35' },
{ id: 71, title: 'item 35' },
{ id: 72, title: 'item 35' },
{ id: 73, title: 'item 35' },
{ id: 74, title: 'item 35' },
{ id: 75, title: 'item 35' },
{ id: 76, title: 'item 35' },
{ id: 77, title: 'item 35' },
{ id: 78, title: 'item 35' },
{ id: 79, title: 'item 35' },
{ id: 80, title: 'item 35' },
{ id: 81, title: 'item 35' },
{ id: 82, title: 'item 35' },
{ id: 83, title: 'item 35' },
{ id: 84, title: 'item 35' },
{ id: 85, title: 'item 35' },
{ id: 86, title: 'item 35' },
{ id: 87, title: 'item 35' },
{ id: 88, title: 'item 35' },
{ id: 89, title: 'item 35' },
{ id: 90, title: 'item 35' },
{ id: 91, title: 'item 35' },
{ id: 92, title: 'item 35' },
{ id: 93, title: 'item 35' },
{ id: 94, title: 'item 35' },
{ id: 95, title: 'item 35' },
{ id: 96, title: 'item 35' },
{ id: 97, title: 'item 35' },
{ id: 98, title: 'item 35' },
{ id: 99, title: 'item 35' },
{ id: 100, title: 'item 35' },
];
pagination: Array<any> = [];
activePage: number;
firstElement: number = null;
lastElement: number = null;
nextElements = [];
nextElementsCounter = 0;
firstActiveElement = null;
@HostListener('click', ['$event']) onclick(event: any) {
this.renderer.addClass(event.target.parentElement.parentElement, 'active');
this.firstActiveElement = this.pages.find(element => element.nativeElement.classList.contains('active'));
if (event.target.parentElement.innerText >= 1 || event.target.parentElement.innerText <= 10) {
this.getFirstAndLastElement(event);
}
if (!this.pages.first.nativeElement.classList.contains('active')) {
this.renderer.removeAttribute(this.prev.nativeElement.firstElementChild, 'disabled');
this.renderer.removeAttribute(this.next.nativeElement.firstElementChild, 'disabled');
}
}
constructor(private renderer: Renderer2) {
}
ngOnInit() {
let paginationLength;
setTimeout(() => {
paginationLength = this.data.length / 10;
// Setting up paginators (clickable pages)
for (let i = 1; i <= paginationLength; i++) {
this.pagination.push(i);
}
}, 1000);
}
ngAfterViewInit() {
this.renderer.setAttribute(this.prev.nativeElement.firstElementChild, 'disabled', 'true');
setTimeout(() => {
this.pages.forEach(element => {
this.nextElements.push(element);
});
this.renderer.addClass(this.pages.first.nativeElement, 'active');
this.firstActiveElement = this.pages.find(element => element.nativeElement.classList.contains('active'));
this.activePage = this.firstActiveElement.nativeElement.innerText;
this.firstElement = (+this.activePage) * 10 - 10 + 1;
this.lastElement = (+this.activePage) * 10;
}, 1000);
}
ngAfterContentChecked() {
setTimeout(() => {
if (this.pages.first.nativeElement.classList.contains('active')) {
this.renderer.removeAttribute(this.next.nativeElement.firstElementChild, 'disabled');
this.renderer.setAttribute(this.prev.nativeElement.firstElementChild, 'disabled', 'true');
}
if (this.pages.last.nativeElement.classList.contains('active')) {
this.renderer.removeAttribute(this.prev.nativeElement.firstElementChild, 'disabled');
this.renderer.setAttribute(this.next.nativeElement.firstElementChild, 'disabled', 'true');
}
}, 1000);
}
getActivePage(event: any) {
return this.activePage = event.target.parentElement.innerText;
}
getFirstAndLastElement(event: any) {
this.getFirstElement(event);
this.getLastElement(event);
}
getFirstElement(event: any) {
return this.firstElement = this.getActivePage(event) * 10 - 10 + 1;
}
getLastElement(event: any) {
return this.lastElement = this.getActivePage(event) * 10;
}
clearActive() {
this.pages.forEach(element => {
this.renderer.removeClass(element.nativeElement, 'active');
});
}
firstPage() {
this.clearActive();
this.renderer.addClass(this.pages.first.nativeElement, 'active');
this.activePage = this.pages.first.nativeElement.innerText;
this.firstElement = this.activePage * 10 - 10 + 1;
this.lastElement = this.activePage * 10;
}
lastPage() {
this.clearActive();
this.renderer.addClass(this.pages.last.nativeElement, 'active');
this.activePage = this.pages.last.nativeElement.innerText;
this.firstElement = this.activePage * 10 - 10 + 1;
this.lastElement = this.activePage * 10;
}
nextPage(event: any) {
this.renderer.removeAttribute(this.prev.nativeElement.firstElementChild, 'disabled');
try {
if (this.firstActiveElement) {
// Finds first active element (with class .active)
this.firstActiveElement = this.pages.find(element => element.nativeElement.classList.contains('active'));
this.activePage = this.firstActiveElement.nativeElement.innerText;
this.firstElement = (+this.activePage + 1) * 10 - 10 + 1;
this.lastElement = (+this.activePage + 1) * 10;
}
} catch (error) {
}
if (this.firstActiveElement != undefined) {
this.renderer.removeClass(this.firstActiveElement.nativeElement, 'active');
this.renderer.addClass(this.firstActiveElement.nativeElement.nextElementSibling, 'active');
} else {
if (this.nextElements[0].nativeElement.classList.contains('active')) {
this.renderer.removeClass(this.nextElements[0].nativeElement, 'active');
}
if (this.nextElements[0] === undefined) {
this.nextElementsCounter++;
}
if (this.nextElementsCounter !== 0) {
this.renderer.removeClass(this.nextElements[(this.nextElementsCounter - 1)].nativeElement, 'active');
}
this.renderer.addClass(this.nextElements[this.nextElementsCounter++].nativeElement, 'active');
try {
this.activePage = +this.pages.first.nativeElement.innerText;
this.firstElement = this.activePage * 10 - 10 + 1;
this.lastElement = this.activePage * 10;
} catch (error) {
}
}
}
prevPage(event: any) {
this.renderer.removeAttribute(this.next.nativeElement.firstElementChild, 'disabled');
this.renderer.removeClass(this.firstActiveElement.nativeElement, 'active');
this.renderer.addClass(this.firstActiveElement.nativeElement.previousElementSibling, 'active');
this.activePage = +this.firstActiveElement.nativeElement.innerText - 1;
this.firstElement = (+this.activePage) * 10 - 10 + 1;
this.lastElement = (+this.activePage) * 10;
}
}
Usage - Advanced with data from API
Advanced exampel with data coming from foreign API.
<main class="container mx-auto text-center ">
<h1 class="h1-responsive text-center my-5">
MDB Angular Pagination - Data from API
</h1>
<div class="row">
<div class="col-md-6 mx-auto mt-5">
<nav class="d-flex justify-content-center my-4 mx-auto text-center">
<ul class="pagination pagination-circle pg-blue mb-0 text-center">
<!--First-->
<li class="page-item">
<a class="page-link" mdbWavesEffect (click)="firstPage()">First</a>
</li>
<li #prev class="page-item">
<button type="button" class="page-link" mdbWavesEffect aria-label="Previous" (click)="prevPage($event)">«</button>
</li>
<li #pages *ngFor="let pageItem of pagination" class="page-item paginator">
<span>
<a class="page-link" (click)="clearActive()" mdbWavesEffect>{{pageItem}}</a>
</span>
</li>
<li #next class="page-item">
<button class="page-link" mdbWavesEffect aria-label="Next" (click)="nextPage($event)">»</button>
</li>
<!--Last-->
<li class="page-item">
<a class="page-link" (click)="lastPage()" mdbWavesEffect>Last</a>
</li>
</ul>
</nav>
</div>
</div>
<div class="row">
<div class="col-md-6 mx-auto">
<table class="table table-bordered">
<thead>
<tr>
<th class="col-1">ID</th>
<th class="col-11">Title</th>
</tr>
</thead>
<tbody>
<tr *ngFor="let post of data">
<th *ngIf="post.id >= firstElement && post.id <= lastElement" scope="row">{{post.id}}</th>
<td *ngIf="post.id >= firstElement && post.id <= lastElement">{{post.title}}</td>
</tr>
</tbody>
</table>
</div>
</div>
</main>
import { Component, OnInit, AfterContentChecked, AfterViewInit, QueryList, ElementRef, ViewChildren, HostListener, Renderer2, ViewChild } from '@angular/core';
import { Http } from '@angular/http';
@Component({
selector: 'app-pagination-api',
templateUrl: './pagination-api.component.html',
styleUrls: ['./pagination-api.component.scss']
})
export class PaginationApiComponent implements AfterViewInit, OnInit, AfterContentChecked {
@ViewChildren('pages') pages: QueryList<ElementRef>;
@ViewChild('next') next: ElementRef;
@ViewChild('prev') prev: ElementRef;
url = 'https://jsonplaceholder.typicode.com/posts';
data;
pagination: Array<any> = [];
activePage: number;
firstElement: number = null;
lastElement: number = null;
nextElements = [];
nextElementsCounter = 0;
firstActiveElement = null;
@HostListener('click', ['$event']) onclick(event: any) {
this.renderer.addClass(event.target.parentElement.parentElement, 'active');
this.firstActiveElement = this.pages.find(element => element.nativeElement.classList.contains('active'));
if (event.target.parentElement.innerText >= 1 || event.target.parentElement.innerText <= 10) {
this.getFirstAndLastElement(event);
}
if (!this.pages.first.nativeElement.classList.contains('active')) {
this.renderer.removeAttribute(this.prev.nativeElement.firstElementChild, 'disabled');
this.renderer.removeAttribute(this.next.nativeElement.firstElementChild, 'disabled');
}
}
constructor(private http: Http, private renderer: Renderer2) {
this.http.get(this.url).map(res => res.json()).subscribe(next => {
this.data = next;
});
}
ngOnInit() {
let paginationLength;
setTimeout(() => {
paginationLength = this.data.length / 10;
// Setting up paginators (clickable pages)
for (let i = 1; i <= paginationLength; i++) {
this.pagination.push(i);
}
}, 1000);
}
ngAfterViewInit() {
this.renderer.setAttribute(this.prev.nativeElement.firstElementChild, 'disabled', 'true');
setTimeout(() => {
this.pages.forEach(element => {
this.nextElements.push(element);
});
this.renderer.addClass(this.pages.first.nativeElement, 'active');
this.firstActiveElement = this.pages.find(element => element.nativeElement.classList.contains('active'));
this.activePage = this.firstActiveElement.nativeElement.innerText;
this.firstElement = (+this.activePage) * 10 - 10 + 1;
this.lastElement = (+this.activePage) * 10;
}, 1000);
}
ngAfterContentChecked() {
setTimeout(() => {
if (this.pages.first.nativeElement.classList.contains('active')) {
this.renderer.removeAttribute(this.next.nativeElement.firstElementChild, 'disabled');
this.renderer.setAttribute(this.prev.nativeElement.firstElementChild, 'disabled', 'true');
}
if (this.pages.last.nativeElement.classList.contains('active')) {
this.renderer.removeAttribute(this.prev.nativeElement.firstElementChild, 'disabled');
this.renderer.setAttribute(this.next.nativeElement.firstElementChild, 'disabled', 'true');
}
}, 1000);
}
getActivePage(event: any) {
return this.activePage = event.target.parentElement.innerText;
}
getFirstAndLastElement(event: any) {
this.getFirstElement(event);
this.getLastElement(event);
}
getFirstElement(event: any) {
return this.firstElement = this.getActivePage(event) * 10 - 10 + 1;
}
getLastElement(event: any) {
return this.lastElement = this.getActivePage(event) * 10;
}
clearActive() {
this.pages.forEach(element => {
this.renderer.removeClass(element.nativeElement, 'active');
});
}
firstPage() {
this.clearActive();
this.renderer.addClass(this.pages.first.nativeElement, 'active');
this.activePage = this.pages.first.nativeElement.innerText;
this.firstElement = this.activePage * 10 - 10 + 1;
this.lastElement = this.activePage * 10;
}
lastPage() {
this.clearActive();
this.renderer.addClass(this.pages.last.nativeElement, 'active');
this.activePage = this.pages.last.nativeElement.innerText;
this.firstElement = this.activePage * 10 - 10 + 1;
this.lastElement = this.activePage * 10;
}
nextPage(event: any) {
this.renderer.removeAttribute(this.prev.nativeElement.firstElementChild, 'disabled');
try {
if (this.firstActiveElement) {
// Finds first active element (with class .active)
this.firstActiveElement = this.pages.find(element => element.nativeElement.classList.contains('active'));
this.activePage = this.firstActiveElement.nativeElement.innerText;
this.firstElement = (+this.activePage + 1) * 10 - 10 + 1;
this.lastElement = (+this.activePage + 1) * 10;
}
} catch (error) {
}
if (this.firstActiveElement != undefined) {
this.renderer.removeClass(this.firstActiveElement.nativeElement, 'active');
this.renderer.addClass(this.firstActiveElement.nativeElement.nextElementSibling, 'active');
} else {
if (this.nextElements[0].nativeElement.classList.contains('active')) {
this.renderer.removeClass(this.nextElements[0].nativeElement, 'active');
}
if (this.nextElements[0] === undefined) {
this.nextElementsCounter++;
}
if (this.nextElementsCounter !== 0) {
this.renderer.removeClass(this.nextElements[(this.nextElementsCounter - 1)].nativeElement, 'active');
}
this.renderer.addClass(this.nextElements[this.nextElementsCounter++].nativeElement, 'active');
try {
this.activePage = +this.pages.first.nativeElement.innerText;
this.firstElement = this.activePage * 10 - 10 + 1;
this.lastElement = this.activePage * 10;
} catch (error) {
}
}
}
prevPage(event: any) {this.renderer.removeAttribute(this.next.nativeElement.firstElementChild, 'disabled');
this.renderer.removeClass(this.firstActiveElement.nativeElement, 'active');
this.renderer.addClass(this.firstActiveElement.nativeElement.previousElementSibling, 'active');
this.activePage = +this.firstActiveElement.nativeElement.innerText - 1;
this.firstElement = (+this.activePage) * 10 - 10 + 1;
this.lastElement = (+this.activePage) * 10;
}
}