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

AngularJS:如何为嵌套ng-repeat指定索引的对象属性添加数据

解决addSplitHours修改所有time.avaiableTime的问题

看起来你遇到的核心问题是所有time对象共享了同一个avaiableTime数组的引用,再加上函数参数传递不匹配,导致每次点击Add按钮时,所有日期的下拉时间选项都会被修改。下面是分步解决的方案:


1. 修正函数参数匹配问题

首先你的HTML调用和函数定义的参数不对应:

  • HTML里调用的是addSplitHours(time.uiDayMs ,$index +1, time),传了三个参数
  • 但函数定义是function addSplitHours(index, time),只接收两个且顺序不对

这会导致你拿到的time不是当前点击对应的那个对象,先把函数参数修正为对应接收的内容:

保持HTML调用不变(参数传递是正确的)

<md-button ng-click="addSplitHours(time.uiDayMs, $index +1, time)"> Add </md-button>

修正函数参数定义

$scope.addSplitHours = addSplitHours;

function addSplitHours(uiDayMs, position, currentTime) {
  // 这里currentTime就是当前点击按钮对应的那个time对象
  // ...后续逻辑基于currentTime操作
}

2. 确保只操作当前time的avaiableTime

接下来,把函数里所有涉及time的操作都替换成currentTime(也就是当前点击对应的那个实例),同时注意你代码里未定义的变量(比如closingTime、avaiableClosingTimes),要确保它们是属于currentTime的属性:

修改后的完整addSplitHours函数

$scope.addSplitHours = addSplitHours;

function addSplitHours(uiDayMs, position, currentTime) {
  // 获取当前最后一组时间段的结束时间,计算新的开始时间
  const lastCloseTime = currentTime.uiDayMs[currentTime.uiDayMs.length - 1][1];
  const newOpen = lastCloseTime + 900000;
  
  // 添加新的时间段到当前time的uiDayMs
  currentTime.uiDayMs.push([newOpen, newOpen + 900000 * 4]);

  // 假设avaiableClosingTimes是currentTime的属性,调整起始和结束时间
  const closingTimeStarts = lastCloseTime + 900000;
  const closingtimeEnds = currentTime.avaiableClosingTimes[currentTime.avaiableClosingTimes.length - 1].msValue;

  // 只向当前time的avaiableTime推送新选项,不会影响其他time
  for (let msValue = closingTimeStarts; msValue <= closingtimeEnds; msValue += 900000) {
    currentTime.avaiableTime.push({
      msValue: msValue,
      display: moment(msValue)
        .utc()
        .format("h:mm A")
    });
  }
}

3. 关键:确保每个time拥有独立的avaiableTime数组

如果你的uiHoursOfOperation是批量初始化的(比如从后端获取后直接赋值),很可能所有time的avaiableTime都指向同一个数组引用。这时候需要在初始化时给每个time创建独立的avaiableTime副本:

初始化示例(根据你的实际数据结构调整)

// 假设yourOriginalData是从后端获取的原始数据
$scope.uiHoursOfOperation = yourOriginalData.map(dayItem => {
  return {
    ...dayItem,
    // 用扩展运算符创建新数组,避免共享引用
    avaiableTime: [...dayItem.avaiableTime],
    // 如果avaiableClosingTimes也可能被修改,同样创建副本
    avaiableClosingTimes: [...dayItem.avaiableClosingTimes]
  };
});

为什么这样能解决问题?

  • 修正参数后,我们明确拿到了当前点击按钮对应的currentTime对象,所有操作都基于这个实例,不会影响其他日期的time。
  • 初始化时创建独立的数组副本,彻底避免了多个time共享同一个avaiableTime引用的问题,确保每个日期的下拉选项都是独立的。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.29 08:24:43