【发布时间】:2015-06-26 16:09:29
【问题描述】:
在我工厂的方法中,我从服务器返回一个带有 Angular 的 $resource 的数组:
var resource = $resource("vm", {
session: function() {
return Auth.token();
},
all: '@all',
vmId: '@vmId'
}, {
listVM: {
method: 'GET',
url: _baseUrl + 'vm/machines',
isArray: true,
cache: false
}
}
...
_obj.getRunningVMs = function(all) {
return resource.listVM({all: all}).$promise;
};
...
return _obj;
在我的 HTML 中(在模板中服务别名为 vms):
<div ng-repeat="machine in vms.getRunningVMs(true) track by machine.id">{{machine.owner}} {{machine.host}}</div>
这导致了一个无限的摘要错误:
错误:[$rootScope:infdig] 达到 10 个 $digest() 迭代。中止!
在最后 5 次迭代中触发的观察者:
[["fn: $watchCollectionWatch; newVal: 22; oldVal: 19"],
["fn: $watchCollectionWatch; newVal: 25; oldVal: 22"],
["fn: $watchCollectionWatch; newVal: 28; oldVal: 25"],
["fn: $watchCollectionWatch; newVal: 31; oldVal: 28"],
["fn: $watchCollectionWatch; newVal: 34; oldVal: 31"]]
我知道这是因为方法调用每次都返回一个全新的数组,这导致 Angular 对监视集合的相等性检查失败。
我试过track by:
<div ng-show="managing === 'machines'" ng-repeat="machine in vms.getRunningVMs(true) track by machine.id">{{machine.owner}} {{machine.host}}</div>
导致以下错误:
错误:[ngRepeat:dupes] 不允许在转发器中重复。使用“track by”表达式指定唯一键。中继器:vms.getRunningVMs(true) 中的机器按 machine.id 跟踪,重复键:未定义,重复值:未定义
我知道id 已定义,并且在$index 跟踪时遇到同样的错误。
track by 是否不适合处理返回新数组的函数,即使是track by?我知道它最初是为了避免不必要的 DOM 突变,但它似乎很容易在这种情况下工作。
【问题讨论】:
标签: javascript angularjs angularjs-ng-repeat