You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Angular ngFor循环中点击图标仅切换当前项为输入框的实现

解决方案

你的思路没问题,用循环索引完全可以实现需求,另外还有一种更灵活的方式——给每个timesheet对象绑定独立状态,两种方案都能确保只有点击的那个<td>内的图标切换为输入框,具体实现如下:

方案一:使用循环索引标记当前编辑项

1. 组件类中添加状态变量

在组件的.ts文件里定义一个变量,用来记录当前正在编辑的索引:

// 初始值设为-1,表示没有正在编辑的项
editingIndex: number = -1;

addOverHrsForTimesheet(timesheet: any, index: number) {
  // 点击时将当前索引设为编辑状态
  this.editingIndex = index;
  // 这里可以添加其他逻辑,比如初始化输入框的值
}

// 可选:完成编辑后重置状态
finishEditing() {
  this.editingIndex = -1;
}

2. 修改模板代码

在<td>的循环里,通过*ngIf判断当前索引是否等于editingIndex,来切换显示图标或输入框:

<td *ngFor="let timesheet of task.timesheets; let i = index" class="w-4 position-relative">
   <div class="input-group">
        <input >
        <!-- 根据当前索引判断显示输入框还是图标 -->
        <span *ngIf="i !== editingIndex" class="input-group-text w-30">
          <em class="bi bi-clock-history" (click)="addOverHrsForTimesheet(timesheet, i)"></em>
        </span>
        <span *ngIf="i === editingIndex" class="input-group-text w-30">
          <input type="number" [(ngModel)]="timesheet.overtime" (blur)="finishEditing()">
        </span>
        <span class="input-group-text w-30"><em class="bi bi-chat-right"></em></span>
   </div>
</td>

方案二:给每个timesheet绑定独立状态

如果需要支持同时编辑多个项,或者不想依赖索引,这种方案更合适:

1. 初始化timesheet的状态

在获取到task.timesheets数据后,给每个对象添加一个状态属性:

// 假设你在获取数据的方法里初始化状态
loadTaskData() {
  // 模拟获取数据
  this.task.timesheets = [/* 你的timesheet数据 */];
  // 给每个timesheet添加编辑状态属性
  this.task.timesheets.forEach(timesheet => {
    timesheet.isEditingOvertime = false;
  });
}

addOverHrsForTimesheet(timesheet: any) {
  // 切换当前timesheet的编辑状态
  timesheet.isEditingOvertime = true;
}

finishEditing(timesheet: any) {
  timesheet.isEditingOvertime = false;
}

2. 修改模板代码

直接根据当前timesheet的状态判断显示内容:

<td *ngFor="let timesheet of task.timesheets; let i = index" class="w-4 position-relative">
   <div class="input-group">
        <input >
        <!-- 根据timesheet自身的状态判断显示内容 -->
        <span *ngIf="!timesheet.isEditingOvertime" class="input-group-text w-30">
          <em class="bi bi-clock-history" (click)="addOverHrsForTimesheet(timesheet)"></em>
        </span>
        <span *ngIf="timesheet.isEditingOvertime" class="input-group-text w-30">
          <input type="number" [(ngModel)]="timesheet.overtime" (blur)="finishEditing(timesheet)">
        </span>
        <span class="input-group-text w-30"><em class="bi bi-chat-right"></em></span>
   </div>
</td>

两种方案的核心逻辑都是给每个<td>绑定独立的判断条件,只有点击的那个项会满足条件切换显示,其他项保持原有状态。

内容的提问来源于stack exchange,提问作者mario

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.09 02:30:57