Это решение работает, если вы хотите показывать по одному пагинатору за раз
Чтобы решить вышеуказанную проблему, я создал директиву прокрутки до. В этой директиве я прослушивал события прокрутки и сравнивал window.pageYOffset
с элементом nativeElement.offsetTop
if (pageYOffset of window < element's offsetTop)
. Им устанавливалось свойство showUpperOne
Значение true, свойство showLowerOne
true.
import {Directive,HostListener,ElementRef} from '@angular/core'
@Directive(
{
selector:"[scrolledTo]",
exportAs:"scrolledTo"
}
)
export class ScrollDirective {
showUpperOne=true;
showLowerOne=false;
constructor(private el:ElementRef){}
@HostListener("window:scroll",['$event'])
onScroll(){
const elementPosition = this.el.nativeElement.offsetTop;
const scrollPosition = window.pageYOffset;
this.showUpperOne=scrollPosition<elementPosition
this.showLowerOne = scrollPosition>= elementPosition;
}
}
Я использовал эту директиву для div, которая содержит два пагинатора, имеющих одинаковую ссылку на шаблон и одну таблицу mat
<div #mainDiv="scrolledTo" scrolledTo class="example-container mat-elevation-z8">
<mat-paginator *ngIf="mainDiv.showUpperOne" #paginator
[pageSize]="currentPageSize"
[pageSizeOptions]="[5, 10, 20]"
(page)="pageEvents($event)"
[showFirstLastButtons]="true">
</mat-paginator>
<mat-table #table [dataSource]="dataSource">...
</mat-table>
<mat-paginator *ngIf="mainDiv.showLowerOne" #paginator
[pageSize]="currentPageSize"
[pageSizeOptions]="[5, 10, 20]"
(page)="pageEvents($event)"
[showFirstLastButtons]="true">
</mat-paginator>
Я установил переменную ссылки на шаблон для div #mainDiv="scrolledTo"
и получил доступ к свойствам директивы показать и скрыть paginators *ngIf="mainDiv.showLowerOne
", *ngIf="mainDiv.showUpperOne"
соответственно.
Это покажет или скроет paginators на свитке, но будет проблема с передачей функциональности paginator другому paginator, как только один paginator скрывается. снова установить источник данных.
Чтобы решить эту проблему, я добавил свойство currentPageSize и установил значение по умолчанию 10 currentPageSize=10;
. Чтобы переназначить paginator на источник данных, я прослушал события страницы, используя (page)="pageEvents($event)"
в шаблоне paginator. И в функции pageEvents
pageEvents(event){
this.currentPageSize=event.pageSize;
}
также при прокрутке
@HostListener("window:scroll",['$event'])
onScroll(){
setTimeout(()=> this.dataSource.paginator = this.paginator,0)
}
Stackblitz: https://stackblitz.com/edit/angular-nbtcgz