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
相关产品推荐
相关产品推荐

