AngularJs 错误:“达到 10 个 $digest() 迭代。中止!”

Posted

技术标签:

【中文标题】AngularJs 错误:“达到 10 个 $digest() 迭代。中止!”【英文标题】:AngularJs error: "10 $digest() iterations reached. Aborting!" 【发布时间】:2014-03-20 09:13:30 【问题描述】:

jsFiddle:http://jsfiddle.net/ADukg/4766/

我已经编写了一些实际上可以正常工作的基本角度代码,并且我得到了所需的结果和输出。但是,我在控制台中遇到了一些错误,这些错误不断循环并最终使浏览器崩溃。我在这里阅读了一些类似的问题,但似乎无法找到使用我的代码的解决方案。

谁能弄清楚出了什么问题以及如何解决?

Error: 10 $digest() iterations reached. Aborting!

【问题讨论】:

【参考方案1】:

从您的函数中,您必须返回一个稳定的对象(或接近稳定的对象)。因为你 var getBreakdown 函数中的新对象,所以 Angular 认为它们是新的,并使用新的哈希键将它们放入范围内。

Angular 然后再次运行这个$digest,以检查以确保没有任何变化......但它会看到新对象并假设模型没有稳定。它再次运行它......并再次获取新对象......一次又一次......一次又一次。

这个故事的寓意是你不应该在分配给作用域的函数内创建新模型。

如果您不需要实时绑定,只需将此 var 转换为新的 $scope var 一次,不要绑定到函数。如果您需要实时绑定,我认为您的解决方案是使用过滤器。

btw... 在你的函数返回之前添加一个console.log(breakdown),检查数组中的每个对象,你会看到它输出了 10 次,每个$$hashkey 的值都是不同的。 Angular 使用$$hashkey 来跟踪对象。我认为这样会更容易理解你是如何混淆它的。

我用来教人们这个概念的例子是一个返回随机数的函数。如果您尝试绑定到该函数......每次获得一个新的随机数并且永远不会稳定时,Angular 都会消化它 10 次。 Angular 永远不会知道它已经完成了消化。这就是为什么他们将其限制为 10 个。

【讨论】:

所以我不需要实时绑定,因为每次需要更新数据时我都会调用该函数。我试图将变量转换为 $scope 但没有运气。你介意更新我的 jsfiddle 给我看吗? 当然,这里是:jsfiddle.net/ADukg/4767 它只在控制器启动时运行一次。每次更改时,您都需要在控制器中调用 getBreakdown。 抱歉,还有一个问题,使用此更新后的代码,我还能从 html 将 userId 传递给函数吗? 当你从 HTML 绑定时,你创建了一个 $watch.. 一个实时绑定。所以不,如果你从 HTML 绑定,你会破坏它。 您也许可以创建一个只返回特定用户的计数的函数,而不是创建对象。然后从那个绑定... ng-repeated 通过活动。不需要新模型。

以上是关于AngularJs 错误:“达到 10 个 $digest() 迭代。中止!”的主要内容,如果未能解决你的问题,请参考以下文章

AngularJS,Node.js,节点模块“幻影”... 注入错误,angularjs 试图加载我的指令 + 后缀

错误错误:在AngularJs中找不到名称为“1”的控件

Angular 混合错误:试图在设置之前获取 AngularJS 注入器

AngularJS中的404错误

在一行内显示 jQuery dataTables 错误(AngularJS)

AngularJS:错误:$q 未定义