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

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

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

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

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

【问题讨论】:

    标签: angularjs


    【解决方案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 通过活动。不需要新模型。
    猜你喜欢
    • 2013-11-10
    • 2016-08-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-05-07
    • 2013-09-19
    • 2013-11-25
    相关资源
    最近更新 更多