'Add a spinner when Mat-table is loading?
I load the data in my material table like that :
ngOnInit(){ return this.annuairesService.getMedecins().subscribe(res => this.dataSource.data = res);}
I want show the spinner when is loading : <mat-spinner ></mat-spinner>
I try : showSpinner: boolean = true;
ngOnInit(){ return this.annuairesService.getMedecins()
.subscribe(res => this.dataSource.data = res);
this.dataSource.subscribe(() => this.showSpinner = false }
but i have this error :
src/app/med-list/med-list.component.ts(54,21): error TS2339: Property 'subscribe' does not exist on type 'MatTableDataSource<{}>'.
Solution 1:[1]
table.component.html
<table mat-table [dataSource]="dataSource" class="mat-elevation-z8">
<!-- table here ...-->
<tr mat-header-row *matHeaderRowDef="displayedColumns"></tr>
<tr mat-row *matRowDef="let row; columns: displayedColumns;"></tr>
</table>
<div *ngIf="isLoading"
style="display: flex; justify-content: center; align-items: center; background: white;">
<mat-progress-spinner
color="primary"
mode="indeterminate">
</mat-progress-spinner>
</div>
table.component.ts
isLoading = true;
dataSource = null;
ngOnInit() {
this.annuairesService.getMedecins()
subscribe(
data => {
this.isLoading = false;
this.dataSource = data
},
error => this.isLoading = false
);
}
Solution 2:[2]
Set showSpinner
to true when you start requesting your data, and set it to false when you receive it (aka, in the subscribe
of your service method)
ngOnInit() {
this.showSpinner = true;
this.annuairesService.getMedecins()
.subscribe(res => {
this.showSpinner = false;
this.dataSource.data = res;
});
}
Solution 3:[3]
If you want the spinner to overlay the rows, for example on paged tables, you can place the spinner overlay before the table with position: absolute
. Just make sure to set position: relative
on the parent container so the overlay does not extend it's parent size.
<div class="mat-elevation-z8 mt-3" style="position: relative;">
<div style="display: flex;
justify-content: center;
align-items: center;
background: rgba(255, 255, 255, 0.6);
position: absolute;
width: 100%;
height: 100%;
z-index: 1;" *ngIf="isLoading" >
<mat-progress-spinner color="accent" mode="indeterminate" diameter="50">
</mat-progress-spinner>
</div>
<table mat-table [dataSource]="data" matSort matSortActive="createDate"
matSortDisableClear matSortDirection="desc">
....
</table>
<mat-paginator [length]="data_count" [pageSize]="10"></mat-paginator>
</div>
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 | umutyerebakmaz |
Solution 2 | bugs |
Solution 3 | F.H. |