Javascript Angular JS:IE错误:已达到10$digest()迭代次数。流产
我对Angular是个新手,我被一个关于IE的问题困扰着 这是我得到的IE错误Javascript Angular JS:IE错误:已达到10$digest()迭代次数。流产,javascript,angularjs,Javascript,Angularjs,我对Angular是个新手,我被一个关于IE的问题困扰着 这是我得到的IE错误 Webpage error details User Agent: Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0) Timestamp: Thu, 13 Dec 2012 04:00:46 UTC Message: 10 $digest() iterations reached. Aborting! Watchers fired i
Webpage error details
User Agent: Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0)
Timestamp: Thu, 13 Dec 2012 04:00:46 UTC
Message: 10 $digest() iterations reached. Aborting!
Watchers fired in the last 5 iterations: [["fn: function $locationWatch() {\n var oldUrl = $browser.url();\n\n if (!changeCounter || oldUrl != $location.absUrl()) {\n\tchangeCounter++;\n\t$rootScope.$evalAsync(function() {\n\t if ($rootScope.$broadcast('$locationChangeStart', $location.absUrl(), oldUrl).\n\t defaultPrevented) {\n\t $location.$$parse(oldUrl);\n\t } else {\n\t $browser.url($location.absUrl(), $location.$$replace);\n\t $location.$$replace = false;\n\t afterLocationChange(oldUrl);\n\t }\n\t});\n }\n\n return changeCounter;\n }; newVal: 7; oldVal: 6"],["fn: function $locationWatch() {\n var oldUrl = $browser.url();\n\n if (!changeCounter || oldUrl != $location.absUrl()) {\n\tchangeCounter++;\n\t$rootScope.$evalAsync(function() {\n\t if ($rootScope.$broadcast('$locationChangeStart', $location.absUrl(), oldUrl).\n\t defaultPrevented) {\n\t $location.$$parse(oldUrl);\n\t } else {\n\t $browser.url($location.absUrl(), $location.$$replace);\n\t $location.$$replace = false;\n\t afterLocationChange(oldUrl);\n\t }\n\t});\n }\n\n return changeCounter;\n }; newVal: 8; oldVal: 7"],["fn: function $locationWatch() {\n var oldUrl = $browser.url();\n\n if (!changeCounter || oldUrl != $location.absUrl()) {\n\tchangeCounter++;\n\t$rootScope.$evalAsync(function() {\n\t if ($rootScope.$broadcast('$locationChangeStart', $location.absUrl(), oldUrl).\n\t defaultPrevented) {\n\t $location.$$parse(oldUrl);\n\t } else {\n\t $browser.url($location.absUrl(), $location.$$replace);\n\t $location.$$replace = false;\n\t afterLocationChange(oldUrl);\n\t }\n\t});\n }\n\n return changeCounter;\n }; newVal: 9; oldVal: 8"],["fn: function $locationWatch() {\n var oldUrl = $browser.url();\n\n if (!changeCounter || oldUrl != $location.absUrl()) {\n\tchangeCounter++;\n\t$rootScope.$evalAsync(function() {\n\t if ($rootScope.$broadcast('$locationChangeStart', $location.absUrl(), oldUrl).\n\t defaultPrevented) {\n\t $location.$$parse(oldUrl);\n\t } else {\n\t $browser.url($location.absUrl(), $location.$$replace);\n\t $location.$$replace = false;\n\t afterLocationChange(oldUrl);\n\t }\n\t});\n }\n\n return changeCounter;\n }; newVal: 10; oldVal: 9"],["fn: function $locationWatch() {\n var oldUrl = $browser.url();\n\n if (!changeCounter || oldUrl != $location.absUrl()) {\n\tchangeCounter++;\n\t$rootScope.$evalAsync(function() {\n\t if ($rootScope.$broadcast('$locationChangeStart', $location.absUrl(), oldUrl).\n\t defaultPrevented) {\n\t $location.$$parse(oldUrl);\n\t } else {\n\t $browser.url($location.absUrl(), $location.$$replace);\n\t $location.$$replace = false;\n\t afterLocationChange(oldUrl);\n\t }\n\t});\n }\n\n return changeCounter;\n }; newVal: 11; oldVal: 10"]]
Line: 7859
Char: 6
Code: 0
URI: http://localhost:8080/__assets__/lib/angular/angular.js
除了IE 8和IE 9之外,其他任何浏览器都不会出现这种情况
我有一只手表在看一个包含位置过滤器的内容过滤对象
我的问题是,为什么除了IE之外,其他浏览器上都不会出现这种情况?我应该怎么做才能摆脱这种情况。提前感谢。我可以从您的错误报告中看出,您有一个$watch作为changeCounter变量,此watcher函数:
function $locationWatch() {
var oldUrl = $browser.url();
if (!changeCounter || oldUrl != $location.absUrl()) {
changeCounter++;
$rootScope.$evalAsync(function () {
if ($rootScope.$broadcast('$locationChangeStart', $location.absUrl(), oldUrl)
.defaultPrevented) {
$location.$$parse(oldUrl);
} else {
$browser.url($location.absUrl(), $location.$$replace);
$location.$$replace = false;
afterLocationChange(oldUrl);
}
});
}
return changeCounter;
};
如果$browser.url()不等于$location.absUrl(),则changeCounter的值将递增。由于$watch函数只能执行10次更改/反应循环,因此在这10次迭代之后它将出错。当您更改正在查看的值时,它最终会中断
我将记录这些值-$location.absUrl()和$browser.url(),并查看为什么在其他浏览器中匹配,但在ie中不匹配。我遇到了相同的错误问题,看起来相同。Chrome\FF工作正常,但IE失败。我在我的应用程序中点击了一些链接,有时会出现这个错误,有时不会 1) 在我看来,我几乎没有这样的链接:
<a href="#" ng-click="addIP(ip)">Add some IP</a>
$scope.IpRanges.push(ip);
3) 集合本身通过ng repeat绑定到视图上,我认为IE无法很好地处理这种情况-绑定\添加\应用事件的顺序可能不正确,否则。。。同样在点击链接后,我在url中添加了#符号,有时它会闪烁,然后我得到了一个错误。因此,我删除了href属性,一切正常:
<a href="" ng-click="addCurrentIP()">Add as allowed IP</a>
对于类似的情况,最好使用span或div。蒂亚戈·罗尔多(Tiago Roldão)绝对正确。我有完全相同的问题。调试后,我在代码中意识到
location.hash = "#/app/" + id;
这会导致无限循环问题。经过一些研究,我发现了这个
$location.path("/apps/" + id);
它完美地解决了我的问题。TLDR
如果您正在使用,那么您也可以使用
$state.go('details', {id:item.ID});
背景
我正在使用以下功能从列表视图导航到详细信息视图,以便您可以使用列表中的ng click=“details(item)”
单击任何内容:
$scope.details = function (item) {
$window.location.href = "#/details/" + item.ID;
}
但我在IE中得到了可怕的10$digest()迭代次数
供参考
在Tiago的回答之后,我在AngularJS v1.2.0rc1 angular.js第7650行中放置了一个断点
// update browser
var changeCounter = 0;
$rootScope.$watch(function $locationWatch() {
var oldUrl = $browser.url();
var currentReplace = $location.$$replace;
if (!changeCounter || oldUrl != $location.absUrl()) {
changeCounter++; /* <-- breakpoint here, line 7650 */
$rootScope.$evalAsync(function() {
if ($rootScope.$broadcast('$locationChangeStart', $location.absUrl(), oldUrl).
defaultPrevented) {
$location.$$parse(oldUrl);
} else {
$browser.url($location.absUrl(), currentReplace);
afterLocationChange(oldUrl);
}
});
}
$location.$$replace = false;
return changeCounter;
});
//更新浏览器
var changeCounter=0;
$rootScope.$watch(函数$locationWatch(){
var oldUrl=$browser.url();
var currentReplace=$location.$$replace;
如果(!changeCounter | | oldUrl!=$location.absUrl()){
changeCounter++;/*在调用$window.history.back()时,我在IE9、IE10中使用AngularJS v1.2.13时遇到了同样的问题(尤其是在Windows Phone中)
根本原因似乎是IE中的$window.history.back()在$locationWatch()被激发之前更改了href,因此oldUrl将包含新Url,并将角度转换为无限的$digest
直接的解决方法是将对$window.history.back()的调用替换为以下内容:
setTimeout(function ()
{
$window.history.back();
}, 0);
我在IE 10中遇到了一个问题。
我在用
window.location.href = '#/';
为了改变路线。
将其替换为
以下代码
$location.path('/');
已解决此问题我在尝试重定向到其他页面时遇到此问题
$window.location.href = '#/path/'
通过更改为解决:
$location.path('/path/');
谢谢你的回复,蒂亚戈。但我得告诉你,这不是我写的函数。这是angular.js作为库函数提供的函数。AngularJS还观看了这一过程。你有没有想到这个问题?对我有用!谢谢!完美!非常感谢:)非常感谢。如果我不知道这是爱的帖子,我会死掉的!嘿,非常感谢!!我花了很多时间,但这解决了我的问题!!删除整个href属性是为了meBravo!解决了我的问题…出于好奇-你是怎么发现的?我想知道你是否有一个在Windows Pho上调试问题的既定流程ne?只需使用IE11或IE10调试网站,并模拟正确的设备和文档模式,它就可以在99%的时间内解决我的问题。但我想知道“setTimeout”是如何解决这个问题的:timeout(函数(){history.go(-1);});