Skip to content

Commit 1d5b9e6

Browse files
committed
fix(paginator): getNumberOfPages off by one
1 parent a62cdb6 commit 1d5b9e6

File tree

3 files changed

+28
-5
lines changed

3 files changed

+28
-5
lines changed

src/demo-app/paginator/paginator-demo.html

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -22,7 +22,8 @@ <h2>No inputs</h2>
2222
<mat-slide-toggle [(ngModel)]="showFirstLastButtons">Show first/last buttons</mat-slide-toggle>
2323
</div>
2424

25-
<mat-paginator (page)="handlePageEvent($event)"
25+
<mat-paginator #paginator
26+
(page)="handlePageEvent($event)"
2627
[length]="length"
2728
[pageSize]="pageSize"
2829
[showFirstLastButtons]="showFirstLastButtons"
@@ -32,4 +33,5 @@ <h2>No inputs</h2>
3233
</mat-paginator>
3334

3435
<div> Output event: {{pageEvent | json}} </div>
36+
<div> getNumberOfPages: {{paginator.getNumberOfPages()}} </div>
3537
</mat-card>

src/lib/paginator/paginator.spec.ts

Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -325,6 +325,23 @@ describe('MatPaginator', () => {
325325
}));
326326
});
327327

328+
it('should keep track of the right number of pages', () => {
329+
component.pageSize = 10;
330+
component.length = 100;
331+
fixture.detectChanges();
332+
expect(paginator.getNumberOfPages()).toBe(10);
333+
334+
component.pageSize = 10;
335+
component.length = 0;
336+
fixture.detectChanges();
337+
expect(paginator.getNumberOfPages()).toBe(0);
338+
339+
component.pageSize = 10;
340+
component.length = 10;
341+
fixture.detectChanges();
342+
expect(paginator.getNumberOfPages()).toBe(1);
343+
});
344+
328345
it('should show a select only if there are multiple options', () => {
329346
expect(paginator._displayedPageSizeOptions).toEqual([5, 10, 25, 100]);
330347
expect(fixture.nativeElement.querySelector('.mat-select')).not.toBeNull();

src/lib/paginator/paginator.ts

Lines changed: 8 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -181,7 +181,7 @@ export class MatPaginator extends _MatPaginatorBase implements OnInit, OnDestroy
181181
if (!this.hasNextPage()) { return; }
182182

183183
const previousPageIndex = this.pageIndex;
184-
this.pageIndex = this.getNumberOfPages();
184+
this.pageIndex = this.getNumberOfPages() - 1;
185185
this._emitPageEvent(previousPageIndex);
186186
}
187187

@@ -192,13 +192,17 @@ export class MatPaginator extends _MatPaginatorBase implements OnInit, OnDestroy
192192

193193
/** Whether there is a next page. */
194194
hasNextPage(): boolean {
195-
const numberOfPages = this.getNumberOfPages();
196-
return this.pageIndex < numberOfPages && this.pageSize != 0;
195+
const maxPageIndex = this.getNumberOfPages() - 1;
196+
return this.pageIndex < maxPageIndex && this.pageSize != 0;
197197
}
198198

199199
/** Calculate the number of pages */
200200
getNumberOfPages(): number {
201-
return Math.ceil(this.length / this.pageSize) - 1;
201+
if (!this.pageSize) {
202+
return 0;
203+
}
204+
205+
return Math.ceil(this.length / this.pageSize);
202206
}
203207

204208

0 commit comments

Comments
 (0)