J'utilise angular pour afficher les données et lier de manière dyammique l'en-tête et les données du tableau. Existe-t-il un moyen de formater dynamiquement le contenu des cellules de la colonne particulière?.
Par exemple, comment puis-je formater la valeur de la colonne de montant alignée à droite?
Mon code est comme ci-dessous:
<table mat-table [dataSource]="dataSource" class="" style="width: 100%;">
<ng-container [matColumnDef]="col" *ngFor="let col of displayedColumns; let i = index">
<th *matHeaderCellDef> {{displayedFields[i].name}}</th>
<td mat-cell *matCellDef="let element"> {{ element[col] }} </td>
</ng-container>
<tr mat-header-row *matHeaderRowDef="displayedColumns"></tr>
<tr mat-row *matRowDef="let row; columns: displayedColumns;"></tr>
</table>
Et mes données sont comme
[
{
"REFERENCE_ID": "ENT201810637610",
"PRODUCT_TYPE": "IMPS",
"CUSTOMER_REFERENCE": "CUS12123",
"BENEFICIARY_NAME": "arun",
"DEBIT_ACCOUNT": "100002258062",
"AMOUNT": 342234,
"STAGE_CODE": "FULLFILMENT",
"STATUS_CODE": "NEW"
},
{
"REFERENCE_ID": "ENT201808820426",
"PRODUCT_TYPE": "IMPS",
"CUSTOMER_REFERENCE": "12121",
"BENEFICIARY_NAME": "Arun",
"DEBIT_ACCOUNT": "32423424",
"AMOUNT": 700,
"STAGE_CODE": "INITIATION",
"STATUS_CODE": "NEW"
}
]
La meilleure solution consiste à utiliser le sélecteur en CSS comme ci-dessous, où 'nom_colonne' est le nom que vous fournissez dans 'matColumnDef'
.mat-column-'column_name'{
//your custom css
text-align: right;
}
si votre colonne 'matColumnDef' est 'montant'
.mat-column-amount{
//your custom css
text-align: right;
}
Si vous souhaitez styliser des cellules sur un mat-table
vous pouvez cibler chaque élément à l'intérieur en utilisant le ::ng-deep
Sélecteur CSS comme celui-ci:
::ng-deep th.mat-header-cell{
width: 140px;
min-width: 140px;
}
Vous pouvez aussi utiliser [ngClass]
pour appliquer des classes à une cellule en fonction d'une condition comme celle-ci:
<ng-container matColumnDef="outcome">
<th mat-header-cell *matHeaderCellDef mat-sort-header class="border"> Outcome </th>
<td mat-cell *matCellDef="let element" class="font-weight-normal text-center text-capitalize"
[ngClass]="[element.outcome == '' ? 'not-provided' : 'not-provided',
element.outcome == 'stopped' ? 'provided-stoped' : 'not-provided']">{{element.outcome == '' ? "not provided" : "provided"}}</span> </td>
</ng-container>
et vous définissez simplement les classes dans votre fichier CSS
Lors de notre projet au travail, nous utilisons beaucoup de tables mates. Je n'ai jamais eu de chance de créer un tableau vraiment personnalisé en ngFor-ing sur le <ng-container>
. Presque chacun de nos tableaux est construit en définissant individuellement chaque <ng-container>
pour chaque colonne.
<ng-container matColumnDef="code">
<th mat-header-cell *matHeaderCellDef> Employee Code </th>
<td mat-cell *matCellDef="let employee"> {{ employee.code }} </td>
</ng-container>
<ng-container matColumnDef="description">
<th mat-header-cell *matHeaderCellDef> Status </th>
<td mat-cell *matCellDef="let employee">
{{ employee.status?.description }}
</td>
</ng-container>
<ng-container matColumnDef="salary">
<th mat-header-cell *matHeaderCellDef> Salary </th>
<td mat-cell *matCellDef="let employee"> {{ employee.salary | currency}} </td>
</ng-container>
L'avantage de ceci est que vous pouvez définir chaque colonne avec les styles que vous souhaitez, ainsi que ajouter des options plus spécifiques à la propriété telles que les tuyaux et/ou l'opérateur elvis.
Vous pouvez définir dynamiquement l'alignement des colonnes à droite en ajoutant quelque chose comme, [align]="expression ? 'right' : ''"
à la <td>
élément, donc pour votre code, cela ressemblerait à:
<table mat-table [dataSource]="dataSource" class="" style="width: 100%;">
<ng-container [matColumnDef]="col" *ngFor="let col of displayedColumns; let i = index">
<th *matHeaderCellDef> {{displayedFields[i].name}}</th>
<td mat-cell *matCellDef="let element" [align]="col === 'AMOUNT' ? 'right' : ''"> {{ element[col] }} </td>
</ng-container>
<tr mat-header-row *matHeaderRowDef="displayedColumns"></tr>
<tr mat-row *matRowDef="let row; columns: displayedColumns;"></tr>
</table>