【问题标题】:How to change one mat-cell value based on a another summarised mat-cell如何根据另一个汇总的 mat-cell 更改一个 mat-cell 值
【发布时间】:2020-08-08 22:06:57
【问题描述】:

我正在使用 Angular 和 Angular Material 进行开发,我是新手(在 8 atm 上),并且通常设法找到我的大多数问题的答案,但找不到这个问题的答案。

我有一个交易的主细节垫表,主垫表具有来自细节行的“总”金额。我现在正在尝试做的,但找不到答案,是让另一个“状态”列显示文本,具体取决于正\负“总”值。

这是我的主从 json。

[
    {
        "id": "50891",
        "description": "February 2020",
        "detail": [
            {
                "Id": 88708,
                "PaymentDate": "2020-02-24",
                "Amount": -58.0,
                "Method": "Charge",
                "Type": "Charge"
            },
            {
                "Id": 88709,
                "PaymentDate": "2020-03-02",
                "Amount": -58.0,
                "Method": "Charge",
                "Type": "Charge"                
            }
        ]
    }   
]

这是我的 mat-cell 列。 'total' 列正在调用一个函数来计算总 'amount' 值。

<ng-container matColumnDef="status">
    <mat-header-cell *matHeaderCellDef> Status </mat-header-cell>
    <mat-cell *matCellDef="let row"> {{ ?? }} </mat-cell>
</ng-container>
<ng-container matColumnDef="total">
    <mat-header-cell *matHeaderCellDef> Total </mat-header-cell>
    <mat-cell *matCellDef="let row"> {{ total(row) | currency: 'GBP' }} </mat-cell>
</ng-container>

这是 ts 文件中进行计算的函数。

total(model: any) {
    return model.details.map(t => t.amount).reduce((acc, value) => acc + value, 0);
}

所以,我现在要做的是根据计算的“总计”列在“状态”列中设置“借方”或“贷方”文本值。我搜索和搜索,但无法找到答案或弄清楚。有谁知道我可以做到这一点的方法吗?

非常感谢

【问题讨论】:

  • 我没听懂你的意思,你能不能创建一个实时的 stackblitz 示例并在此处分享链接,以便开发人员获得并帮助你实现你想要的目标
  • 这里是 stackblitz 示例stackblitz.com/edit/angular-material-starter-x98nar 我需要在月级别求和但在编辑\删除时重新计算的详细金额,因此不能仅在加载 json 数据时执行此操作。然后根据总和值,我想要一个信用\借记状态,这就是我需要一些帮助的地方。谢谢

标签: angular angular-material mat-table


【解决方案1】:

您可以使用与总额相同的格式,方法是插入一个基于总值返回“借方”或“贷方”的函数。

  <ng-container matColumnDef="status">
    <mat-header-cell *matHeaderCellDef> Status </mat-header-cell>
    <mat-cell *matCellDef="let row"> {{ getStatus(row) }} </mat-cell>
  </ng-container>
getStatus(mode: any) {
  let total = model.details.map(t => t.amount).reduce((acc, value) => acc + value, 0);
  return (total < 0) 'debit' : 'credit';
}

您可能要考虑的另一个策略是遍历您的数据并将这些属性(状态和总计)添加到组件初始化的数据中。当您像在此处所做的那样在模板中放置一个函数时,这些函数会在每次重新渲染时运行,因此在开始时运行一次会更便宜。

【讨论】:

  • 我确实认为我可以做第一个解决方案,但认为在 2 个地方进行计算是徒劳的。我确实在交易上有一个删除\编辑选项,所以当事情发生变化时需要重新计算。
  • 如果您不想多次计算,那么您绝对不应该将函数调用放入模板中,因为每次重新渲染都会调用它。您可以在初始化时将该属性添加到对象中,然后再次迭代以在您从数据集中添加和删除时重新计算。
  • 好的,很高兴知道。我会采纳你的建议并尝试一下。
  • 有一些工作。我只是根据您的建议更新对象。谢谢迪伦。
猜你喜欢
  • 2019-09-01
  • 1970-01-01
  • 2019-03-29
  • 2019-03-17
  • 1970-01-01
  • 2023-04-03
  • 2021-12-14
  • 2018-12-14
  • 1970-01-01
相关资源
最近更新 更多