我有一个名为current_item.get_user_history()
的JS函数,它通过make和API调用返回一个数组,它看起来就像这样:
things[0]:
thing_id: 5
user_id: 23
paddle_no: 1234
item_id: 893
price: 5000
things[1]:
thing_id: 4
user_id: 67
paddle_no: 6743
item_id: 893
price: 4500
... and so on
我希望能够从此数组中获取数据,以使用ng-repeat填充表格。
<div class="bid_history">
<table>
<tr>
<th>
Column 1
</th>
<th>
Column 2
</th>
<th>
Column 3
</th>
</tr>
<tr ng-repeat="thing in current_item.get_user_history() track by thing.id">
{{thing.user_id}} {{thing.price}}
</tr>
</table>
</div>
由于某些原因,没有任何东西被渲染,并且它似乎做了很多重复,因为我在chrome控制台中得到了无法阻挡的错误数量。感谢任何帮助,以准确解释如何使用ng-repeat
。
答案 0 :(得分:2)
您无法在$digest()
中使用触发$http
的功能(例如$timeout
,ng-repeat
)。它会导致无限$digest()
循环。
有解释:
https://github.com/angular/angular.js/issues/705或angular Infinite $digest Loop in ng-repeat。
之前我犯了同样的错误:)
Infinite loop when ng-repeat/ng-class calls a function which calls $http
您必须先保存current_item.get_user_history()
数据,然后使用ng-repeat
来调用数据。
scope.things= urrent_item.get_user_history();
<tr ng-repeat="thing in things track by thing.id">
答案 1 :(得分:0)
简答
不要在ngRepeat
上为退货项目调用函数。将项数组存储在作用域中的属性上。
$scope.user_history = current_item.get_user_history();
如果您确实需要这样做,可以使用以下方法之一进行修复:
current_item.get_user_history()
来电时创建新对象。hashKey
方法。有关示例,请参阅this topic。 中等答案
您通常不希望在ng-repeat中迭代函数。原因是current_item.get_user_history()
返回带有新对象的数组。此对象没有hashKey
,并且在ngRepeat
缓存中不存在。因此,每个ngRepeat
上的watch.get
会为{{thing.id}}
的新监视为其创建新范围。第一个watch.get()
上的此手表有watch.last == initWatchVal
。那么watch.get() != watch.last
。那么$digest
开始一个新的遍历。然后ngRepeat
使用新手表创建新范围,依此类推。然后在10次遍历后,您将收到错误。
长答案 查看this post,了解其工作原理。
答案 2 :(得分:0)
问题是摘要周期正在返回一个承诺,我不得不把它变成一个对象。
我原本是这样做的:
my_api.get_user_history(self.id);
并且必须将其添加到该行:
.then(function(data){self.user_history = data});
部分问题也是@Ealon所提到的。我还决定将它存储在局部变量中,而不是返回函数的结果。我发布了这个答案,因为上面的每个答案都是有效的部分,我需要考虑并整理起来解决我的问题。谢谢大家的帮助和指导。