递归ng-include抛出“10 $ digest()迭代达到”

时间:2015-09-18 08:26:16

标签: javascript angularjs

我正在使用这样的递归ng-repeat呈现树结构:

<div class="folder-item"
     ng-repeat="place in places"
    <div class="folder-children"
         ng-repeat="data in place.children"
         ng-include="'tree_item_renderer.html'">
    </div>
</div>

和模板:

<script type="text/ng-template"
            id="tree_item_renderer.html">
        <div>
            <!-- some irrelevant code -->

            <div ng-if="data.children">
                <div class="folder-children"
                     ng-repeat="data in data.children"
                     ng-include="'tree_item_renderer.html'"></div>
            </div>
        </div>
    </script>

这很好,直到有10个或更多级别深,然后我得到10 $digest() iterations reached错误被抛出。

我该如何解决?到目前为止我找不到任何解决方案。

2 个答案:

答案 0 :(得分:2)

10个摘要循环的限制是为了防止由10个继承的作用域引起的性能问题(其中一个作用域的任何更改都会触发所有10个作用域的摘要周期,这是一项非常昂贵的任务。 / p>

docs所述,您可以更改最大摘要周期数,但您应该记住:

  

增加TTL可能会影响性能,因此如果没有正确的理由,就不应该更改它。

将数量从10增加到配置块:

angular.module('myApp',[])
.config(function($rootScopeProvider) {
    $rootScopeProvider.digestTtl(number); //some number bigger then 10
})

另一种方法是在没有性能损失的情况下,编写一个指令,在内部实现递归,并在内部管理更改。

答案 1 :(得分:1)

默认情况下,Angular通过identity =&gt;跟踪对象尝试在ng-repeat中使用$ index跟踪:

ng-repeat="data in data.children track by $index"