'How to add pagination in angular material table that bind to API response
I'm new to angular. In my project shown list of products and its work correctly.
My HTML code is below :
<table mat-table [dataSource]="list_product" style="width: 20%;">
<!-- id Column -->
<ng-container matColumnDef="id" style="width: 20%;">
<th mat-header-cell *matHeaderCellDef style="align-items: center;"> id </th>
<td mat-cell *matCellDef="let list_product"> {{list_product.id}} </td>
</ng-container>
<!-- description Column -->
<ng-container matColumnDef="description">
<th mat-header-cell *matHeaderCellDef> Name </th>
<td mat-cell *matCellDef="let list_product"> {{list_product.description}} </td>
</ng-container>
<tr mat-header-row *matHeaderRowDef="displayedColumns"></tr>
<tr mat-row *matRowDef="let row; columns: displayedColumns;"></tr>
</table>
<mat-paginator [pageSizeOptions]="[5, 10, 20]" showFirstLastButtons></mat-paginator>
and my TypeScript code is -
import { Component, OnInit,ViewChild } from '@angular/core';
import { HttpClient } from '@angular/common/http';
import { analyzeAndValidateNgModules } from '@angular/compiler';
import { MatPaginator} from '@angular/material/paginator';
import { MatTableDataSource} from '@angular/material/table';
@Component({
selector: 'app-basic',
templateUrl: './basic.component.html',
styleUrls: ['./basic.component.scss']
})
export class BasicComponent implements OnInit {
public list_product:any=[];
displayedColumns: string[] = ['id', 'description'];
@ViewChild(MatPaginator) paginator: MatPaginator;
constructor(private http:HttpClient) { }
ngOnInit(): void {
this.get_data();
this.list_product.paginator = this.paginator;
}
get_data(){
this.http.get<any>("http://localhost:3000/listp").subscribe(
res => this.list_product = res
)
}
}
Pagination does not work and all of list are shown. Pagination buttons does not work in html file.
Solution 1:[1]
For client side pagination, the MatTableDataSource
has pagination, sorting and filtering functionality built-in to it.
Follow the steps below -
- Use
MatTableDataSource
type as thedataSource
and initialize it with an empty array - Set the
data
property ofMatTableDataSource
once data is received - Get a reference of the table's
paginator
with@ViewChild
- Implement
AfterViewInit
to set thepaginator
property ofMatTableDataSource
once the view is initialized
Your final component code should look something like -
export class BasicComponent implements OnInit, AfterViewInit {
public list_product = new MatTableDataSource<any>([]); // <-- STEP (1)
displayedColumns: string[] = ['id', 'description'];
@ViewChild(MatPaginator) private paginator: MatPaginator; // <-- STEP (3)
constructor(private http:HttpClient) { }
ngOnInit(): void {
this.get_data();
}
get_data(){
this.http.get<any>("http://localhost:3000/listp").subscribe(
res => this.list_product.data = res // <-- STEP (2)
);
}
ngAfterViewInit(): void {
this.list_product.paginator = this.paginator; // <-- STEP (4)
}
}
You should explore the documentation for further details.
Sources
This article follows the attribution requirements of Stack Overflow and is licensed under CC BY-SA 3.0.
Source: Stack Overflow
Solution | Source |
---|---|
Solution 1 |