Je suis novice dans angular et j'essaie d'implémenter la pagination dans mon application. J'essaie d'utiliser ce composant matériel.
Avec le code ci-dessous, je peux obtenir length
, pagesize
et pageSizeOptions
dans mon fichier .ts
<md-paginator [length]="length"
[pageSize]="pageSize"
[pageSizeOptions]="pageSizeOptions"
</md-paginator>
export class PaginatorConfigurableExample {
length = 100;
pageSize = 10;
pageSizeOptions = [5, 10, 25, 100];
}
}
mais je n'arrive pas à déclencher une fonction pour modifier les données du tableau ci-dessus lorsque la page est modifiée. De plus, comment utiliser les méthodes nextPage
, previousPage
, hasNextPage
et hasPreviousPage
?
Je me bats avec le même ici. Mais je peux vous montrer ce que j’ai fait faire des recherches . Fondamentalement, vous commencez par ajouter l’événement page @Output dans le fichier foo.template.ts :
<md-paginator #paginator
[length]="length"
[pageIndex]="pageIndex"
[pageSize]="pageSize"
[pageSizeOptions]="[5, 10, 25, 100]"
(page)="pageEvent = getServerData($event)"
>
</md-paginator>
Et plus tard, vous devez ajouter l'attribut pageEvent dans la classe foo.component.ts et les autres pour gérer les exigences de pagination:
pageEvent: PageEvent;
datasource: null;
pageIndex:number;
pageSize:number;
length:number;
Et ajoutez la méthode qui va récupérer les données du serveur:
ngOnInit() {
getServerData(null) ...
}
public getServerData(event?:PageEvent){
this.fooService.getdata(event).subscribe(
response =>{
if(response.error) {
// handle error
} else {
this.datasource = response.data;
this.pageIndex = response.pageIndex;
this.pageSize = response.pageSize;
this.length = response.length;
}
},
error =>{
// handle error
}
);
return event;
}
Ainsi, chaque fois que vous cliquez sur la pagination, vous activez la méthode getServerData (..) qui appelle foo.service.ts récupère toutes les données requises. Dans ce cas, vous n'avez pas besoin de gérer les événements nextPage et nextXXX car ils seront automatiquement calculés lors du rendu de la vue.
J'espère que cela peut vous aider. Faites-moi savoir si vous avez eu du succès. =]
Hé alors je suis tombé sur ça et je l’ai fait, voici comment:
dans mon composant.html
<mat-paginator #paginator [pageSize]="pageSize" [pageSizeOptions]="[5, 10, 20]" [showFirstLastButtons]="true" [length]="totalSize"
[pageIndex]="currentPage" (page)="pageEvent = handlePage($event)">
</mat-paginator>
Dans mon composant.ts
public array: any;
public displayedColumns = ['', '', '', '', ''];
public dataSource: any;
public pageSize = 10;
public currentPage = 0;
public totalSize = 0;
@ViewChild(MatPaginator) paginator: MatPaginator;
constructor(private app: AppService) { }
ngOnInit() {
this.getArray();
}
public handlePage(e: any) {
this.currentPage = e.pageIndex;
this.pageSize = e.pageSize;
this.iterator();
}
private getArray() {
this.app.getDeliveries()
.subscribe((response) => {
this.dataSource = new MatTableDataSource<Element>(response);
this.dataSource.paginator = this.paginator;
this.array = response;
this.totalSize = this.array.length;
this.iterator();
});
}
private iterator() {
const end = (this.currentPage + 1) * this.pageSize;
const start = this.currentPage * this.pageSize;
const part = this.array.slice(start, end);
this.dataSource = part;
}
Tout le travail de pagination est effectué à partir de la méthode iterator
. Cette méthode calcule les skip
et take
et les assigne à dataSource
pour la table Material.
Un autre moyen de lier Angular Paginator à la table de données à l'aide de Slice Pipe.Here, les données ne sont extraites qu'une seule fois du serveur.
Vue:
<div class="col-md-3" *ngFor="let productObj of productListData |
slice: lowValue : highValue">
//actual data dispaly
</div>
<mat-paginator [length]="productListData.length" [pageSize]="pageSize"
(page)="pageEvent = getPaginatorData($event)">
</mat-paginator>
Composant
pageIndex:number = 0;
pageSize:number = 50;
lowValue:number = 0;
highValue:number = 50;
getPaginatorData(event){
console.log(event);
if(event.pageIndex === this.pageIndex + 1){
this.lowValue = this.lowValue + this.pageSize;
this.highValue = this.highValue + this.pageSize;
}
else if(event.pageIndex === this.pageIndex - 1){
this.lowValue = this.lowValue - this.pageSize;
this.highValue = this.highValue - this.pageSize;
}
this.pageIndex = event.pageIndex;
}
Le problème de la question initiale est que vous ne capturez pas l'événement "page". Pour résoudre ce problème, vous devez ajouter (page)='yourEventHandler($event)
'en tant qu'attribut dans la balise md-paginator.
vérifier un exemple de travail ici
Vous pouvez également consulter la documentation de l'API ici
Composant:
import { Component, AfterViewInit, ViewChild } from @angular/core;
import { MatPaginator } from @angular/material;
export class ClassName implements AfterViewInit {
@ViewChild(MatPaginator) paginator: MatPaginator;
length = 1000;
pageSize = 10;
pageSizeOptions: number[] = [5, 10, 25, 100];
ngAfterViewInit() {
this.paginator.page.subscribe(
(event) => console.log(event)
);
}
HTML
<mat-paginator
[length]="length"
[pageSize]="pageSize"
[pageSizeOptions]="pageSizeOptions"
[showFirstLastButtons]="true">
</mat-paginator>
Après avoir passé quelques heures là-dessus, je pense que c’est la meilleure façon d’appliquer la pagination. Et plus important encore, cela fonctionne. Ceci est mon code de pagination <mat-paginator #paginatoR [length]="length" [pageSize]="pageSize" [pageSizeOptions]="pageSizeOptions">
Dans mon composant @ViewChild(MatPaginator) paginator: MatPaginator;
pour voir l'enfant et enfin vous devez lier le paginateur à la table dataSource et voici comment cela se fait ngAfterViewInit() {this.dataSource.paginator = this.paginator;}
si cela fonctionne pour vous alors marquez ceci comme réponse.