角材料表单元格格式

时间:2018-10-31 13:46:04

标签: javascript angular angular-material angular-material-table

我正在使用角度材质表来显示数据,并动态绑定表头和表数据。 有什么方法可以动态格式化特定列的单元格内容?

例如,如何格式化金额列的值右对齐?

我的代码如下:

<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>

我的数据就像

[
  {
    "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"
  }
]

5 个答案:

答案 0 :(得分:2)

在我们工作的项目中,我们使用了很多垫子桌子。我从来没有碰到过通过在<ng-container>上进行ngFor-ing来制作任何类型的真正定制表的运气。我们几乎每个表都是通过为每列分别定义每个<ng-container>来构建的。

<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>

这样做的好处是您可以使用所需的样式定义每列,以及添加更多特定于属性的选项,例如管道和/或elvis运算符。

答案 1 :(得分:2)

最佳解决方案是在CSS中使用选择器,如下所示,其中“ column_name”是您在“ matColumnDef”中提供的名称

.mat-column-'column_name'{
   //your custom css 
   text-align: right;
 }

如果您的“ matColumnDef”列为“金额”

.mat-column-amount{
   //your custom css 
   text-align: right;
 }

答案 2 :(得分:1)

如果要在mat-table上设置单元格样式,可以使用::ng-deep CSS选择器来定位内部的每个元素,如下所示:

::ng-deep th.mat-header-cell{
    width: 140px;
    min-width: 140px;
}

您还可以根据以下条件使用[ngClass]将类应用于单元格:

 <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>

您只需在CSS文件中定义类

答案 3 :(得分:0)

您可以通过向[align]="expression ? 'right' : ''"元素添加<td>之类的元素来动态地将列对齐方式设置为正确,因此对于您的代码,它看起来像:

<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>

答案 4 :(得分:0)

我想要一个类似的东西,但在特定列上更复杂的显示样式。我正在使用循环来显示所有需要的列。

也许这个代码片段有帮助

Custom styled columns

我在 mat-h​​eader-cell 和 mat-cell 中使用了一个简单的 ngIf 来控制它。

<table mat-table [dataSource]="dataSource" class="preview-table">
    <ng-container matColumnDef="{{column}}" *ngFor="let column of dcolumns">

        <th mat-header-cell *matHeaderCellDef>
            <ng-container *ngIf="!(column === 'tagList')">
                {{column}}
            </ng-container>
            <ng-container *ngIf="column === 'tagList'">
                {{column}} h
            </ng-container>
        </th>
        <td mat-cell *matCellDef="let element">
            <ng-container *ngIf="!(column === 'tagList')">
                {{element[column]}}
            </ng-container>
            <ng-container *ngIf="column === 'tagList'">
                {{element[column]}} h
            </ng-container>
        </td>

    </ng-container>

    <!-- other field as per syntax -->

</table>