为什么我达到了 $digest () 迭代?如何跟踪递归脚本的活动
Why am I getting $digest () iterations reached? How can I track my recursive script's activity?
我试图理解我的递归脚本,它的效率很低。
我尝试创建计数器,告诉我它被调用了多少次以及从哪里调用,这样我就可以更好地理解它的行为。但是,我在控制台中收到错误,指出它重载了它可以调用的迭代次数:
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}}
创建一个替代方案。
相关文章:
- 动态分配GA增强型电子商务跟踪器
- 跟踪在页面加载时应用内联样式的JavaScript
- 跟踪用户点击Adsense广告的IP地址
- 跟踪jqplot垂直折线图的鼠标位置
- 点击facebook像素跟踪注册(JS/JQUERY代码)
- 有没有一种方法可以从URL跟踪请求的域
- Javascript-在视频中跟踪鼠标位置
- 在Google Analytics中跟踪用户,但只能在两个操作之间跟踪
- 如何使用Google Analytics跟踪表单提交
- Fresh Spark Install+Homestead上的Vue异步堆栈跟踪错误
- 代码挑战:创建一个跟踪对象实例总数的类Foo
- 打印javascript控制台的堆栈跟踪
- 谷歌分析:如何跟踪移动网站的点击量作为对主网站的点击
- 即使光标位于屏幕边缘,也可以跟踪鼠标速度
- 什么'这是谷歌分析跟踪代码使用的技术
- 如何将Google Analytics配置为将URL参数作为单个页面进行跟踪
- 使用jquery-php跟踪跟踪点击
- 通过跟踪跟踪眼睛.js
- 谷歌分析事件跟踪:跟踪下拉表单中的链接
- 使用Dojo'跟踪跟踪总体加载进度