【问题标题】:Alternate the Angular material icon by clicking通过单击来替换 Angular 材质图标
【发布时间】:2019-10-05 19:23:34
【问题描述】:

我有一个材料表,其中有一列称为状态(见图)

我需要的是通过单击材料图标,该图标应根据“ts”文件中设置的值交替显示。我正在使用公共变量来更改图标。但是,由于我只使用一个变量,所有行都会产生效果。此外,如果我使用单击项目的 id 控制它,则先前单击的值(图标)将替换为旧值(图标)。供您参考,我正在通过 observable (API) 显示和保存数据。因此无法从 API 中获取值并立即在列表中显示它。下面是 HTML 和 'ts' 的代码:

onClick(event, row) {
  if (event.srcElement.innerText === 'panorama_fish_eye') {
      this.statusIconTextTrue = 'check_circle';
      taskStatus = 'FINISHED_COMPLETED';
      archived = true;
      timeFinishedActual = new Date().getTime();
    } else {
      this.statusIconTextTrue = 'panorama_fish_eye';
      taskStatus = 'CREATED';
      archived = false;
      timeFinishedActual = null;
    }
}
<mat-icon (click)="onClick($event, element)">
                  {{ statusIconID == element.taskuuid && statusIconTextTrue ? statusIconTextTrue : statusIconText  }}
                </mat-icon>

几天来,我一直在努力寻找正确的逻辑来解决问题。对此有何想法或可能是其他一些解决方案?提前致谢。

【问题讨论】:

  • 最简单的方法是在row 上维护一个属性。这也将帮助您摆脱检查 innerText 的困境。您的代码中有很多未定义的变量,它们也应该存在于row
  • 感谢@chrispbacon 的评论。 'row' 变量保存 API 从初始加载时提供的值。所以通过点击我们只能得到那个值。对不起其他未定义的变量。尽管这些实际上并不是未定义的。这些用于保存到 API 的目的。你能给我更多的细节吗?再次感谢
  • 将上述代码放入stackblitz demo

标签: angular angular-material


【解决方案1】:

Yasir,使用“状态”的值。点击只改变状态,见stackblitz

<ng-container matColumnDef="status">
    <th mat-header-cell *matHeaderCellDef> Status </th>
    <td (click)="element.status=!element.status" mat-cell *matCellDef="let element">
        <mat-icon>
            {{ element.status?'check_circle' : 'block'  }}
        </mat-icon>
    </td>
</ng-container>

如果您收到的数据中没有“状态”,您可以在订阅服务后轻松添加。想象一下,你有一个服务,它返回一个具有唯一属性日期的数据数组,你可以做类似

dataService.subscribe((res:any)=>{
   res.forEach(x=>{
      x.status=false;
   })
   this.data=res
})

注意:在例如状态只有两个值“true”和“false”,这就是点击变得如此简单的原因就像(click)="element.status=!element.status"可以有两个值'finish'和'unfinish'然后列变成像

<ng-container matColumnDef="status">
    <th mat-header-cell *matHeaderCellDef> Status </th>
    <td (click)="element.status=element.status=='finish'?'unfinish':'finish'
        mat-cell *matCellDef="let element">
        <mat-icon>
            {{ element.status=='finish'?'check_circle' : 'block'  }}
        </mat-icon>
    </td>
</ng-container>

【讨论】:

  • 嗨@Eliseo,非常感谢您的回答。好消息是它对我有用:-)。我很佩服你的努力,因为你一针见血,虽然我的代码不是那么漂亮。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2016-09-08
  • 2018-10-08
  • 2019-01-01
  • 2018-01-08
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多