2
votes

Comment afficher un message vide dans une table de données dynamique angulaire

J'essaie d'afficher une erreur de message vide lorsque le filtre n'a pas de correspondance avec:

<mat-toolbar color="primary">My full table</mat-toolbar>
<mat-form-field>
    <input matInput (keyup)="applyFilter($event.target.value)" placeholder="Filter">
</mat-form-field>
<mat-table #table [dataSource]="dataSource">
    <ng-container matColumnDef="name">
        <mat-header-cell *matHeaderCellDef mat-sort-header>Name </mat-header-cell>
        <mat-cell *matCellDef="let element"> {{element.name}} </mat-cell>
    </ng-container>
    <ng-container matColumnDef="age">
        <mat-header-cell *matHeaderCellDef mat-sort-header>Age </mat-header-cell>
        <mat-cell *matCellDef="let element"> {{element.age}} </mat-cell>
    </ng-container>
    <mat-header-row *matHeaderRowDef="displayedColumns"></mat-header-row>
    <mat-row *matRowDef="let row; columns: displayedColumns;" (click)="row.toggle(row)">
    </mat-row>
</mat-table>
<div *ngIf="dataSource.length === 0">No data</div>

mais cela ne fonctionne pas car je crée une table dynamique avec MatTableDataSource. p >

Pour une meilleure compréhension, j'ai changé ma table dynamique pour un tableau prédéfini.

    import { Component, OnInit } from '@angular/core';
import {MatTableDataSource} from '@angular/material';

export interface SociosElement {
  nombre: string;
  edad: number;
}

const ELEMENT_DATA: MembersElement[] = [
  { name: 'Jenny', age: 17 },
  { name: 'Daniel', age: 18 }
];

@Component({
  selector: 'app-pruebas',
  templateUrl: './tableMembers.component.html',
  styleUrls: ['./tableMembes.component.css']
})
export class PruebasComponent {
  displayedColumns: string[] = ['name', 'age'];
  dataSource = new MatTableDataSource(ELEMENT_DATA);

  applyFilter(filterValue: string) {
    this.dataSource.filter = filterValue.trim().toLowerCase();
  }
}

Cependant, il est nécessaire d'utiliser MatTableDataSource pour une construction dynamique de la table des utilisateurs

Ceci est tout mon code ts.

const ELEMENT_DATA: MembersElement[] = [
{ name: 'Jenny', age: 17 },
{ name: 'Daniel', age: 18 }
];

Ceci est mon code HTML.

<div *ngIf="dataSource.length === 0">No data</div>


0 commentaires

3 Réponses :


7
votes

Vous ne pouvez pas atteindre ce que vous voulez en utilisant la condition * ngIf = "dataSource.length === 0" simplement parce que la source de données ne change pas du tout lorsque vous effectuez un filtrage. ce que vous devez faire est de faire attention à la longueur des données filtrées. vous pouvez utiliser quelque chose comme suivant: * ngIf = "dataSource.filteredData.length> 0" comme condition. la longueur des modifications datasource.filteredData en fonction des résultats filtrés. cette condition peut masquer votre table. vous pouvez mettre ceci dans votre balise de table comme:


0 commentaires

3
votes

Une mise en garde à l'utilisation de ngIf. Si vous utilisez matSort et que vous imbriquez la table dans un bloc à l'aide de * ngIf, le tri ne fonctionnera pas car le ngIf définit le viewChild sur undefined. Référence

Utilisez [ngClass] pour contourner ce problème

.hidden {
  visibility: hidden;
}

.visible {
  visibility: visible;
}

Voici le CSS pour les classes

<div [ngClass]="dataSource.filteredData.length > 0 ? 'visible': 'hidden'">
  <mat-table #table [dataSource]="dataSource" matSort>
    <ng-container matColumnDef="name">
      <mat-header-cell *matHeaderCellDef mat-sort-header>Name </mat-header-cell>
      <mat-cell *matCellDef="let element"> {{element.name}} </mat-cell>
    </ng-container>
    <ng-container matColumnDef="age">
      <mat-header-cell *matHeaderCellDef mat-sort-header>Age </mat-header-cell>
      <mat-cell *matCellDef="let element"> {{element.age}} </mat-cell>
    </ng-container>
    <mat-header-row *matHeaderRowDef="displayedColumns"></mat-header-row>
    <mat-row *matRowDef="let row; columns: displayedColumns;" (click)="row.toggle(row)">
    </mat-row>
  </mat-table>
</div>
<div [ngClass]="dataSource.filteredData.length > 0 ? 'hidden': 'visible'">
  <tr>No results found.</tr>
</div>


0 commentaires

0
votes

Pour un mat-table, avant la v10, vous pouvez donner à la table une ligne de données lorsque votre dataSource est vide en faisant ceci: [dataSource] = "dataSource.data.length> 0 && dataSource.data.filteredData> 0? dataSource: emptyDataSource" Créez ensuite une colonne par défaut pour votre cellule afin d'afficher le message de données vide:

< / code> Puis changez votre ligne def pour afficher la colonne de ligne vide def lorsque dataSource est vide: < / p>

https://stackblitz.com/edit/angular-mat-table-no-data?file=src%2Fapp%2Ftable-basic-flex-example.html

Après Angular Material 10, ils ont ajouté une directive lorsqu'il n'y a pas de données dans la table: "Si vous voulez afficher un message lorsque les données ne correspondent pas au filtre, vous pouvez utiliser la directive * matNoDataRow." https://v10.material.angular.io/components/table/overview# filtrage


0 commentaires

Aucune donnée