From 534af71f40cfba930737ff48b18be9a6b39ac04e Mon Sep 17 00:00:00 2001 From: crisbeto Date: Mon, 24 Dec 2018 16:14:08 +0200 Subject: [PATCH] fix(paginator): update page index if invalid after length change Updates the page index of a paginator if its length changed to something where the index isn't valid anymore (e.g. the user is on the last page and the amount of pages becomes smaller). Fixes #14520. --- src/lib/paginator/paginator.spec.ts | 21 +++++++++++++++++++++ src/lib/paginator/paginator.ts | 12 ++++++++++++ 2 files changed, 33 insertions(+) diff --git a/src/lib/paginator/paginator.spec.ts b/src/lib/paginator/paginator.spec.ts index d6dfe0e714db..7b3b23af99f1 100644 --- a/src/lib/paginator/paginator.spec.ts +++ b/src/lib/paginator/paginator.spec.ts @@ -414,6 +414,27 @@ describe('MatPaginator', () => { expect(getLastButton(fixture).hasAttribute('disabled')).toBe(true); }); + it('should update the page index when switching to a smaller length', fakeAsync(() => { + fixture.componentInstance.length = 50; + fixture.componentInstance.pageSize = 10; + fixture.componentInstance.pageIndex = 4; + fixture.detectChanges(); + + expect(paginator.pageIndex).toBe(4); + + fixture.componentInstance.pageEvent.calls.reset(); + + fixture.componentInstance.length = 10; + fixture.detectChanges(); + tick(); + + expect(paginator.pageIndex).toBe(0); + expect(fixture.componentInstance.pageEvent).toHaveBeenCalledWith(jasmine.objectContaining({ + previousPageIndex: 4, + pageIndex: 0 + })); + })); + }); function getPreviousButton(fixture: ComponentFixture) { diff --git a/src/lib/paginator/paginator.ts b/src/lib/paginator/paginator.ts index 0445dcd9f502..b9dd464cc24d 100644 --- a/src/lib/paginator/paginator.ts +++ b/src/lib/paginator/paginator.ts @@ -100,6 +100,18 @@ export class MatPaginator extends _MatPaginatorBase implements OnInit, OnDestroy get length(): number { return this._length; } set length(value: number) { this._length = coerceNumberProperty(value); + + const maxPageIndex = Math.max(this.getNumberOfPages() - 1, 0); + const currentPageIndex = this._pageIndex; + + if (currentPageIndex > maxPageIndex && this.initialized) { + // Needs to happen on the next tick, in order to avoid "changed after checked" errors. + Promise.resolve().then(() => { + this._pageIndex = maxPageIndex; + this._emitPageEvent(currentPageIndex); + }); + } + this._changeDetectorRef.markForCheck(); } _length: number = 0;