167 votes

Tri par défaut dans Angular Material - En-tête de tri

Comment puis-je modifier le code Angular Material ci-dessous, afin que la table de données soit triée par la colonne 'nom', par ordre croissant par défaut. La flèche (indiquant la direction actuelle du tri) doit être affichée.

C'est ce que je veux réaliser :

enter image description here

Code original :

<table matSort (matSortChange)="sortData($event)">
  <tr>
    <th mat-sort-header="name">Dessert (100g)</th>
    <th mat-sort-header="calories">Calories</th>
    <th mat-sort-header="fat">Fat (g)</th>
    <th mat-sort-header="carbs">Carbs (g)</th>
    <th mat-sort-header="protein">Protein (g)</th>
  </tr>

  <tr *ngFor="let dessert of sortedData">
    <td>{{dessert.name}}</td>
    <td>{{dessert.calories}}</td>
    <td>{{dessert.fat}}</td>
    <td>{{dessert.carbs}}</td>
    <td>{{dessert.protein}}</td>
  </tr>
</table>

J'ai essayé quelque chose comme ça, mais ça ne fonctionne pas (pas de flèche affichée, pas de tri).

<table matSort (matSortChange)="sortData($event)" matSortActive="name" matSortStart="asc" matSortDisableClear>

Voici le lien vers Plunker

1 votes

Pourrait appeler this.sortData({active: "name", direction: "asc"}) sur ngOnInit vérifier plunker

1 votes

@PankajParkar Ce n'est pas la bonne solution. La table est triée, mais l'en-tête de tri ne le sait pas et la flèche (indiquant la direction actuelle du tri) n'est pas affichée.

246voto

Andrew Seguin Points 1202

Vous vous trompez. matSortStart pour matSortDirection .

Essayez ça :

<table matSort (matSortChange)="sortData($event)" matSortActive="name" matSortDirection="asc" matSortDisableClear>

https://stackblitz.com/edit/angular-defaultsort?file=src/app/sort-overview-example.html

matSortStart peut être utilisé pour inverser le cycle utilisé lors du tri (par exemple, lorsque l'utilisateur clique pour trier, le tri commence par desc au lieu de asc).

Edit : Merci Ben d'avoir fourni un exemple mis à jour

7 votes

Cette méthode ne fonctionne que la première fois. Après que la source de données de la table ait été modifiée, j'essaie de redéfinir l'attribut matSortActive et matSortDirection mais la petite flèche n'est pas affichée

1 votes

L'échantillon semble ne plus fonctionner, j'en ai fait un nouveau : stackblitz.com/edit/angular-defaultsort?file=src/app/

0 votes

Vous pouvez déclencher le tri et corriger le bug de la flèche cachée avec cette solution . J'utilise mat-sort-header sans source de données, et c'est la seule solution qui a fonctionné.

71voto

Nino Filiu Points 3662

Vous pouvez trier le tableau de manière programmatique en invoquant la fonction sort(Sortable) de la source de données. En supposant que vous avez une dataSource propriété du composant pour la source de données :

// to put next to the class fields of the component
@ViewChild(MatSort) sort: MatSort

// to put where you want the sort to be programmatically triggered, for example inside ngOnInit
this.sort.sort(({ id: 'name', start: 'asc'}) as MatSortable);
this.dataSource.sort = this.sort;

2 votes

C'est à peu près ce que je cherche, mais le seul problème est que cela déclenche les matSortChange événement. Existe-t-il un moyen de définir le tri sans déclencher l'événement ?

0 votes

Non. C'est ainsi que le tri est appelé. Pourquoi ne voulez-vous pas que l'événement matSortChange soit déclenché ?

1 votes

Parce que je l'ai configuré pour mettre à jour un cookie avec asc / desc d'une colonne et si elle est appelée à chaque fois que la page est chargée, elle sera différente à chaque fois.

32voto

Aman Madiiarbekov Points 111
@ViewChild(MatSort) sort: MatSort;

this.dataSource.sort = this.sort;

const sortState: Sort = {active: 'name', direction: 'desc'};
this.sort.active = sortState.active;
this.sort.direction = sortState.direction;
this.sort.sortChange.emit(sortState);

devrait fonctionner. Démonstration

Et pour afficher la flèche de direction du tri, ajoutez le css suivant (solution de contournement)

th.mat-header-cell .mat-sort-header-container.mat-sort-header-sorted .mat-sort-header-arrow {
    opacity: 1 !important;
    transform: translateY(0) !important;
}

4 votes

Veuillez fournir quelques explications avec votre code, afin que l'utilisateur ultérieur puisse suivre vos idées/code plus facilement.

1 votes

J'ai utilisé le tri de Nino et le contournement CSS ici pour obtenir mon tri programmé pour montrer la flèche.

0 votes

Dans angular 7, j'ai simplement défini le paramètre this.sort = { active : 'name', direction : 'desc' } ; et je n'ai pas eu à ajouter de modifications CSS pour que la flèche soit active.

12voto

sschmid Points 903

Mise à jour pour le matériel (testé avec la v7.3) :

@ViewChild(MatSort) matSort: MatSort;

private someMethod(): void {
  this.matSort.sort({ id: 'columnName', start: 'asc', disableClear: false });
}

Cela permettra également de mettre à jour le mat-sort-header sans aucune solution de rechange

0voto

federico scamuzzi Points 2599

Peut-être avez-vous essayé d'appeler sur le init de la page la fonction de tri forcée sur le nom et la direction ?

     ngOnInit() {
    let defSort: Sort = {};
    defSort.direction = 'asc';
    defSort.active = 'name';
    this.sortData(defSort);
  }

7 votes

Ce n'est pas la bonne solution. La table est triée, mais l'en-tête de tri ne le sait pas et la flèche (indiquant la direction actuelle du tri) n'est pas affichée.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X