Javascript 为什么我得到$digest()迭代次数?如何跟踪递归脚本';谁的活动?

Javascript 为什么我得到$digest()迭代次数?如何跟踪递归脚本';谁的活动?,javascript,angularjs,counter,watch,Javascript,Angularjs,Counter,Watch,我试图理解我的递归脚本,它的效率很低 我尝试创建计数器,告诉我它被调用了多少次以及从哪里调用,这样我就能更好地理解它的行为。但是,我在控制台中遇到了错误,它使它可以调用的迭代次数过载: Uncaught Error: 10 $digest() iterations reached. Aborting! Watchers fired in the last 5 iterations: [["fn: function (context) {\n for(var i = 0, ii

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

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

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  .........
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
表达式的结果


你需要做一个
{{counter}}
的替代品,它不依赖于
$watch
表达式的结果(例如,直接写入元素)。

我的第一反应是将计数器排除在模型之外;潜在的问题是,如果同一页上有多个树,这些树仍然可以由非作用域计数器处理。“您需要选择
{{counter}}
”有什么建议吗?您可以触发事件(
作用域。$emit
作用域。$broadcast
)使用
incrementCounter
函数中的计数器值,然后创建一个侦听该事件的指令(
scope.$on
),并将元素内容直接更新到DOM中(
elem.text(…)
)。
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: []
    }];
}]);