为何AngularJS使用ng-repeat时突然出现ngRepeat:iexp错误?
报错信息:Error: [ngRepeat:iexp] Expected expression in form of 'item in collection[ track by id]' but got ''.
报错触发原因
AngularJS抛出该错误的核心是ng-repeat指令解析到的遍历表达式不符合item in 集合的格式要求,结合你提供的代码,具体触发点如下:
- 控制器别名不匹配:你
<tbody>标签上通过ng-controller="EventRollController as eventRollCtrl"声明的控制器别名为eventRollCtrl,但ng-repeat中写的遍历源是eventCtrl.events,如果父级作用域没有额外声明eventCtrl,eventCtrl.events会返回undefined,特殊场景下会被解析为空字符串,触发格式校验错误。 - 变量赋值异常:如果你近期修改过数据请求逻辑,可能存在
events变量被意外赋值为null、undefined的情况,导致ng-repeat没有拿到有效的遍历集合。
解决方法
按照优先级依次排查修改即可:
- 修正控制器别名引用错误
如果events数组是定义在EventRollController中的,将ng-repeat表达式中的eventCtrl替换为你声明的别名eventRollCtrl即可,修改后代码如下:
<tr scope="row" data-ng-repeat="event in eventRollCtrl.events">
- 增加变量兜底逻辑
在对应控制器的初始化代码中给events设置空数组默认值,避免接口请求失败、变量被意外重写时出现空值:
// 写在EventRollController初始化逻辑中 this.events = [] // 后续接口请求成功后再赋值 this.events = 接口返回的数组
- 可选优化:增加track by规则
如果存在数组元素重复的场景,可以在表达式末尾添加track by规则避免重复项报错,示例:
<!-- 有唯一主键id用event.id,没有就用内置的$index --> <tr scope="row" data-ng-repeat="event in eventRollCtrl.events track by $index">
内容的提问来源于stack exchange,提问作者stefanks
相关产品推荐
相关产品推荐

