AngularJS中ng-repeat遍历数组失效,报[$rootScope:infdig]错误求助
解决AngularJS中ng-repeat遍历失败与[$rootScope:infdig]无限循环错误
看起来你遇到了嵌套ng-repeat里的双重麻烦:子级ng-repeat无法正常遍历数组,还触发了无限digest循环错误。让我一步步帮你拆解原因和解决方案:
问题根源分析
首先,[$rootScope:infdig]错误几乎总是因为视图中调用的函数在每次digest循环返回新的引用类型值(比如新数组、新对象)。你视图里的{{getUniqueOS(AppVersions[version])}}虽然用ng-hide="true"隐藏了,但Angular依然会在每个digest周期执行这个函数。如果getUniqueOS每次调用都生成一个新数组(比如内部用[]或Array.from创建新数组),Angular会检测到“值变化”,触发新一轮digest,循环10次后就会抛出这个错误。
而这个无限循环会打乱Angular的正常渲染流程,导致子级的ng-repeat="os in osList"根本没机会正确执行,看起来就像无法遍历数组。
解决方案:避免在视图中调用动态生成引用的函数
正确的做法是在控制器中预先计算并缓存结果,而不是在视图里实时调用函数。
步骤1:修改控制器逻辑,预计算并缓存去重后的OS列表
$scope.uniqueOSMap = {}; // 用对象缓存每个version对应的去重OS列表 // 监听versions和AppVersions的变化,数据更新时重新计算 $scope.$watchGroup(['versions', 'AppVersions'], function(newValues) { const [versions, AppVersions] = newValues; if (!versions || !AppVersions) return; // 遍历每个version,计算对应的去重OS列表 angular.forEach(versions, function(version) { const appVersionData = AppVersions[version]; if (!appVersionData) return; // 这里替换成你实际的去重逻辑,示例用Set去重 const uniqueOS = [...new Set(appVersionData.map(item => item.os))]; $scope.uniqueOSMap[version] = uniqueOS; }); });
步骤2:修改视图,直接使用预缓存的列表
把原来视图中隐藏的getUniqueOS调用去掉,直接引用控制器里预计算好的uniqueOSMap:
<tr> <td ng-repeat="(v,version) in versions"> <table> <tr> <!-- 直接使用预计算的OS列表,无需再调用函数 --> <td ng-repeat="os in uniqueOSMap[version] track by $index"> {{os}} </td> </tr> </table> </td> </tr>
额外检查点
如果你的osList是独立的变量(不是和getUniqueOS相关),还要确保:
osList是在数据准备完成后赋值的(比如异步请求返回后再赋值)- 如果是动态更新的,要确保赋值操作是在Angular的digest循环内(比如用
$scope.$apply,如果在异步回调里)
这样修改后,既解决了无限循环的问题,子级的ng-repeat也能正常遍历数组了。
内容的提问来源于stack exchange,提问作者Navya Nagaraj
相关产品推荐
相关产品推荐

