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

如何仅修改当前行的Progress Bar,不影响其他行?

解决单一行进度条独立更新的问题

嘿,这个问题我之前也碰到过!核心原因是你现在所有的进度条都共用了同一个percentage和progress全局变量,所以修改时所有行的进度都会跟着变化。下面是具体的解决方案,让每一行的进度条都能独立更新:

1. 调整组件内的数据结构

首先要把每个ID对应的进度数据单独存储,不再使用全局变量。比如用一个数组来保存每个条目的进度信息:

// 在你的Component类中定义
progressData: { id: number; percentage: string; progress: number }[] = [];

// 初始化时给每个数据项设置初始进度(假设你的数据列表是dataList)
ngOnInit() {
  this.dataList.forEach(item => {
    this.progressData.push({
      id: item.key.id,
      percentage: '0%', // 初始进度百分比
      progress: 0       // 初始进度数值
    });
  });
}

2. 修改HTML模板的绑定逻辑

让每一行的进度条绑定对应ID的专属进度数据,而不是全局变量:

<!-- 假设你是用*ngFor循环渲染所有行 -->
<div *ngFor="let item of dataList" class="progress aqua" 
     [attr.data-width]="getProgressItem(item.key.id).percentage" 
     (mousedown)="startUpdateSlider(item)" 
     (mouseup)="endUpdateSlider(item)" 
     (mouseleave)="endUpdateSlider(item)" 
     (mousemove)="updateSlider($event, item)">
  <div class="progress-text">{{getProgressItem(item.key.id).progress}}</div>
  <div class="progress-bar" [style.width]="getProgressItem(item.key.id).percentage">
    <div class="progress-text">{{getProgressItem(item.key.id).progress}}</div>
  </div>
</div>

3. 更新进度条的控制方法

修改updateSlider等方法,确保只更新目标ID对应的进度数据:

currentID: number | null = null;
updateSliderToggle = false;

startUpdateSlider(data) { 
  this.currentID = data.key.id; 
  this.updateSliderToggle = true; 
}

endUpdateSlider(data) {
  this.updateSliderToggle = false;
  this.currentID = null;
}

updateSlider(event: MouseEvent, data) {
  // 只处理当前选中的ID
  if (!this.updateSliderToggle || this.currentID !== data.key.id) return;

  // 这里保留你原来的进度计算逻辑
  const progressBar = event.currentTarget as HTMLElement;
  const rect = progressBar.getBoundingClientRect();
  const x = event.clientX - rect.left;
  const calcPercentage = `${Math.max(0, Math.min(100, (x / rect.width) * 100))}%`;
  const calcProgress = Math.round((x / rect.width) * 100);

  // 找到对应ID的进度数据并更新
  const targetItem = this.progressData.find(item => item.id === data.key.id);
  if (targetItem) {
    targetItem.percentage = calcPercentage;
    targetItem.progress = calcProgress;
  }
}

// 辅助方法:根据ID获取对应的进度数据
getProgressItem(id: number) {
  return this.progressData.find(item => item.id === id) || { percentage: '0%', progress: 0 };
}

关键要点总结

  • 数据隔离:每个进度条对应独立的进度数据对象,不再共用全局变量
  • 精准更新:在更新方法中只修改当前选中ID对应的进度数据
  • 模板绑定:通过辅助方法快速找到对应ID的进度数据,确保模板绑定的是专属数据

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.14 09:02:34