【发布时间】:2014-12-15 13:44:54
【问题描述】:
我是 AngularJS 新手,遇到了一个问题。
我有一个通过 $http GET 请求检索到的发票 JSON 数组,该请求在此处循环:
<a ng-repeat="invoice in invoices" href="#" class="list-group-item">
{{ invoice[data]["TxnDate"][0] }} -
{{ invoice[data]["DocNumber"][0] }} -
${{ invoice[data]["TotalAmt"][0] }} -
{{ getCustomer(invoice[data]["Id"][0]) }}
<i class="fa fa-chevron-right pull-right"></i>
<i class="pull-right">Edit</i>
</a>
问题是发票数组除了客户的参考号之外没有存储任何关于客户的信息。
因此,我创建了一个名为 getCustomer 的函数,它通过参考号在我的 API 中查询客户的姓名。
$scope.getCustomer = function(id) {
var customer_id = id.match(/\d+/)[0];
$http.post('/customers', customer_id).success(function(response) {
console.log(response);
});
};
问题是我收到此错误:
error: [$rootscope:infdig] 10 $digest() iterations reached. aborting! watchers fired in the last 5 iterations: []
稍后,我会想出一个更有效的方法来做到这一点,但我很想知道是什么导致了这个错误?
经过一番研究,我认为这与一旦其中一个列表项中的数据发生变化,AngularJS 需要检查所有列表项这一事实有关。尽管如此,我还是很困惑。这样做的正确方法是什么?
【问题讨论】:
-
发票从何而来?你能展示一下你的代码吗?
-
@RaphaelRafatpanah 您应该发布一些关于您的数据结构(即发票)的见解。它是什么样子的。什么是“数据”索引器?您是否在发票结构等中使用了两级嵌套数组?
-
我刚刚阅读了您的更新。如果您想避免这种情况并且仅在从集合中添加或删除项目时刷新您的 ng-repeat,您可以简单地使用“track by”符号,如下所示:
ng-repeat="invoice in invoices track by $index"。另请参阅 ng-repeat 的 angularjs 文档。默认实现基于计算的 $hash 刷新,每次更改任何嵌套项的字段时都会更改。
标签: angularjs