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

AngularJS中ng-repeat遍历对象数组陷入无限循环的解决方法

解决AngularJS ng-repeat无限循环([$rootScope:infdig])问题

错误原因

AngularJS的脏检查机制会多次执行视图中绑定的表达式(比如ng-if里的$ctrl.isHighlighted()),直到模型状态稳定。你的isHighlighted()方法每次调用都会填充或修改items数组,这会导致数组的引用或内容发生变化,触发新一轮脏检查循环。当循环次数超过10次时,就会抛出[$rootScope:infdig]错误。

解决方案

1. 分离模型修改与状态判断逻辑

把填充items数组的代码从isHighlighted()中抽离,放到组件初始化钩子(如$onInit())或按需触发的方法中,让isHighlighted()只负责返回判断结果,不修改任何模型数据。

组件代码示例:

// 初始化时填充数组,或在需要更新时调用
this.$onInit = function() {
  this.loadItems();
};

// 仅返回高亮状态判断结果
this.isHighlighted = function() {
  return this.items && this.items.length > 0;
};

// 专门负责填充items数组的方法
this.loadItems = function() {
  // 这里写原来isHighlighted中填充数组的逻辑
  this.items = [
    { method: 0, text: 'text1' },
    { method: 1, text: 'text2' },
    { method: 3, text: 'text3' }
  ];
};

2. 避免在绑定表达式中生成新数组

如果你的填充逻辑每次都会创建新数组(比如this.items = [...newData]),即使内容相同,数组引用的变化也会触发脏检查。确保只在数据真正需要更新时才修改数组,而非每次判断状态都重新生成。

3. 用属性绑定替代方法调用

在组件中维护一个布尔属性isHighlighted,当items数组变化时更新该属性,视图直接绑定这个属性,避免每次脏检查都执行方法。

组件代码示例:

this.isHighlighted = false;
this.items = [];

this.$onInit = function() {
  this.loadItems();
  this.updateHighlightStatus();
};

this.loadItems = function() {
  this.items = [
    { method: 0, text: 'text1' },
    { method: 1, text: 'text2' },
    { method: 3, text: 'text3' }
  ];
  // 数组更新后同步状态
  this.updateHighlightStatus();
};

this.updateHighlightStatus = function() {
  this.isHighlighted = this.items.length > 0;
};

视图代码修改:

<div class="item" ng-if="$ctrl.isHighlighted">
    <div class="item-label">Highlighted field</div>
    <span ng-repeat="item in $ctrl.items track by $index">
        <span>{{item.text}}</span>
    </span>
</div>

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.11 23:08:30