为什么我达到了 $digest () 迭代?如何跟踪递归脚本的活动

Why am I getting $digest () iterations reached? How can I track my recursive script's activity?

本文关键字:何跟踪 跟踪 递归 活动 脚本 迭代 为什么 digest      更新时间:2023-09-26

我试图理解我的递归脚本,它的效率很低。

尝试创建计数器,告诉我它被调用了多少次以及从哪里调用,这样我就可以更好地理解它的行为。但是,我在控制台中收到错误,指出它重载了它可以调用的迭代次数:

Uncaught Error: 10 $digest() iterations reached. Aborting!
Watchers fired in the last 5 iterations: [["fn: function (context) {'n          for(var i = 0, ii = length, part; i<ii; i++) {'n            if (typeof (part = parts[i]) == 'function') {'n  .........

在进行了大量阅读之后,我有一种强烈的感觉,这与 Angular 每次更新计数器时重新计算所有内容有关,$watch认为这是一种变化,引发了新的$digest轮。这是对的吗?

如果是这样,如何在递归脚本上实现计数器?

为了提供一个与我正在尝试做的事情非常相似的例子,我用ganarajpr分叉了一个JSFiddle,并添加到这里:JSFiddle。

根据 Stackoverflow 的要求,代码复制如下:

.HTML:

<div ng-app="myApp">
<div ng-controller="MainCtrl">
<script type="text/ng-template"  id="tree_item_renderer.html">
    {{incrementCounter()}}
    {{data.name}}
    <button class="btn btn-primary" ng-click="add(data)">Add node</button>
    <button class="btn btn-primary" ng-click="delete(data)" ng-show="data.nodes.length > 0">Delete nodes</button>
    <ul>
        <li ng-repeat="data in data.nodes" ng-include="'tree_item_renderer.html'"></li>
    </ul>
</script>
<ul ng-app="Application" ng-controller="TreeController">
    <li ng-repeat="data in tree" ng-include="'tree_item_renderer.html'"></li>
</ul>
    <h3> Counter {{counter}}</h3>
</div>
</div>

Javascript:

var app = angular.module("myApp", []);
app.controller("MainCtrl", ['$scope', function ($scope) {
    $scope.counter = 0;
    $scope.incrementCounter = function () {
        console.log("Increment called");
        $scope.counter++;
        document.counter++;
    }
}]);
app.controller("TreeController", ['$scope', function ($scope) {
    $scope.delete = function (data) {
        data.nodes = [];
    };
    $scope.add = function (data) {
        var post = data.nodes.length + 1;
        var newName = data.name + '-' + post;
        data.nodes.push({
            name: newName,
            nodes: []
        });
    };
    $scope.tree = [{
        name: "Node",
        nodes: []
    }];
}]);

$digest循环中,你的{{incrementCounter()}}会导致{{counter}}发生变化,从而导致一个新的$digest循环,从而导致对{{incrementCounter()}}无穷无尽的另一个评估。基本上,如果你有一个每$digest周期递增的计数器,你就不能让该变量影响任何$watch表达式的结果。

您需要为不依赖于$watch表达式结果(例如直接写入元素)的{{counter}}创建一个替代方案。