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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.21 08:10:57