Search code examples
angularangular-materialangular6

mat-filtering/mat-sort not work correctly when use ngif in mat-table parent


Note that paging/sort not work correctly. Paging does not show the number of elements it is showing and sorting does not work, but if you delete the line in the html file *ngIf="dataSource?.filteredData.length > 0" the error is fixed. If you use filtering, it works, but it does not show the filter amount

Check the example.

https://stackblitz.com/edit/angular-wqkekh-nm3pn2?file=app/table-pagination-example.html


Solution

  • In your component.ts, replace this code

    @ViewChild(MatPaginator) paginator: MatPaginator;
    @ViewChild(MatSort) sort: MatSort;
    
    ngAfterViewInit() {
        this.dataSource.paginator = this.paginator;
        this.dataSource.sort = this.sort;
    }
    

    with this :

      private paginator: MatPaginator;
      private sort: MatSort;
    
    
      @ViewChild(MatSort) set matSort(ms: MatSort) {
        this.sort = ms;
        this.setDataSourceAttributes();
      }
    
      @ViewChild(MatPaginator) set matPaginator(mp: MatPaginator) {
        this.paginator = mp;
        this.setDataSourceAttributes();
      }
    
      setDataSourceAttributes() {
        this.dataSource.paginator = this.paginator;
        this.dataSource.sort = this.sort;
      }
    

    And in your html:

        <mat-card *ngIf="!dataSource?.filteredData.length" style="margin-bottom: 5px">
            <div><span>ZERO RESULT</span></div>
        </mat-card>
    
        <mat-card *ngIf="dataSource?.filteredData.length">
        ** insert the table code that you have **
        </mat-card>