Reputation: 85
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.
Upvotes: 3
Views: 16575
Reputation: 1
if you need the backend to paginate results, i have my paginator like this
<mat-paginator
#paginator
(page)="pageChangeEvent($event)"
[length]="totalResults"
[pageSize]="pageLimit"
[pageIndex]="pageIndex"
[pageSizeOptions]="[5, 10, 20]"
showFirstLastButtons
aria-label="Select page of data">
</mat-paginator>
and then on the pageChangeEvent in the TS file
pageChangeEvent(event: {
length: number;
pageIndex: number;
pageSize: number;
previousPageIndex: number;
}) {
this.pageLimit = event.pageSize.toString();
this.pageIndex = event.pageIndex;
this.getMoreData();
}
getMoreData() {
this.visitService
.getFollowUps(
this.pageLimit,
this.pageIndex,
//any other params
)
.subscribe(
(data: any) => {
this.loading = false;
//for other uses not in the table
this.data = data.results;
this.pageIndex = data.page_index;
this.pageLimit = data.page_limit;
this.totalResults = data.total_results;
//assign it to the data source as well
this.dataSource.data = data.results;
},
(err) => {
this.loading = false;
console.log(err);
}
);
}
Upvotes: 0
Reputation: 8315
For client side pagination, the MatTableDataSource
has pagination, sorting and filtering functionality built-in to it.
Follow the steps below -
MatTableDataSource
type as the dataSource
and initialize it with an empty arraydata
property of MatTableDataSource
once data is receivedpaginator
with @ViewChild
AfterViewInit
to set the paginator
property of MatTableDataSource
once the view is initializedYour 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.
Upvotes: 6