我是 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 in the last 5 iterations: [["fn: function $locationWatch() {n var oldUrl = $browser.url();nn if (!changeCounter || oldUrl != $location.absUrl()) {ntchangeCounter++;nt$rootScope.$evalAsync(function() {nt if ($rootScope.$broadcast('$locationChangeStart', $location.absUrl(), oldUrl).nt defaultPrevented) {nt $location.$$parse(oldUrl);nt } else {nt $browser.url($location.absUrl(), $location.$$replace);nt $location.$$replace = false;nt afterLocationChange(oldUrl);nt }nt});n }nn return changeCounter;n }; newVal: 7; oldVal: 6"],["fn: function $locationWatch() {n var oldUrl = $browser.url();nn if (!changeCounter || oldUrl != $location.absUrl()) {ntchangeCounter++;nt$rootScope.$evalAsync(function() {nt if ($rootScope.$broadcast('$locationChangeStart', $location.absUrl(), oldUrl).nt defaultPrevented) {nt $location.$$parse(oldUrl);nt } else {nt $browser.url($location.absUrl(), $location.$$replace);nt $location.$$replace = false;nt afterLocationChange(oldUrl);nt }nt});n }nn return changeCounter;n }; newVal: 8; oldVal: 7"],["fn: function $locationWatch() {n var oldUrl = $browser.url();nn if (!changeCounter || oldUrl != $location.absUrl()) {ntchangeCounter++;nt$rootScope.$evalAsync(function() {nt if ($rootScope.$broadcast('$locationChangeStart', $location.absUrl(), oldUrl).nt defaultPrevented) {nt $location.$$parse(oldUrl);nt } else {nt $browser.url($location.absUrl(), $location.$$replace);nt $location.$$replace = false;nt afterLocationChange(oldUrl);nt }nt});n }nn return changeCounter;n }; newVal: 9; oldVal: 8"],["fn: function $locationWatch() {n var oldUrl = $browser.url();nn if (!changeCounter || oldUrl != $location.absUrl()) {ntchangeCounter++;nt$rootScope.$evalAsync(function() {nt if ($rootScope.$broadcast('$locationChangeStart', $location.absUrl(), oldUrl).nt defaultPrevented) {nt $location.$$parse(oldUrl);nt } else {nt $browser.url($location.absUrl(), $location.$$replace);nt $location.$$replace = false;nt afterLocationChange(oldUrl);nt }nt});n }nn return changeCounter;n }; newVal: 10; oldVal: 9"],["fn: function $locationWatch() {n var oldUrl = $browser.url();nn if (!changeCounter || oldUrl != $location.absUrl()) {ntchangeCounter++;nt$rootScope.$evalAsync(function() {nt if ($rootScope.$broadcast('$locationChangeStart', $location.absUrl(), oldUrl).nt defaultPrevented) {nt $location.$$parse(oldUrl);nt } else {nt $browser.url($location.absUrl(), $location.$$replace);nt $location.$$replace = false;nt afterLocationChange(oldUrl);nt }nt});n }nn 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 以外的任何其他浏览器上,以及我应该怎么做才能摆脱这种情况。提前谢谢。
Tiago Roldão绝对是对的。我有完全相同的问题。调试后,我意识到在我的代码中我有
location.hash = "#/app/" + id;
这会导致无限循环问题。经过一番研究,我发现了这个
$location.path("/apps/" + id);
这完美地解决了我的问题。
我遇到了同样的错误问题,看起来是一样的。Chrome\FF工作正常,但IE失败了。我单击了应用程序中的一些链接,有时收到此错误,有时没有。
1)在我看来,我有几个链接看起来像这样:
<a href="#" ng-click="addIP(ip)">Add some IP</a>
2)这些链接的单击处理程序将新对象添加到IpRanges集合中,如下所示:
$scope.IpRanges.push(ip);
3)集合本身是通过ng-repeat绑定的,我认为IE无法很好地处理这种情况-可能绑定\添加\应用事件的顺序不正确,否则...同样在单击链接后,我将#符号添加到url中,有时它会闪烁,然后我遇到了错误。所以我删除了 href 属性,一切正常:
<a href="" ng-click="addCurrentIP()">Add as allowed IP</a>
对于类似情况,最好使用 spans 或div。
IE9,IE10中使用AngularJS v1.2.13时遇到了同样的问题,当调用$window.history.back()(特别是在Windows Phone中)。
似乎根本原因是 IE 中的 $window.history.back() 在触发 $locationWatch() 之前更改了 href,因此 oldUrl 将包含新的 Url,这会将角度抛向无限$digest。
直接的解决方法是对 $window.history.back() 的调用替换为以下内容:
setTimeout(function ()
{
$window.history.back();
}, 0);
我可以从您的错误报告中看出您有一个 changeCounter 变量的$watch,以及这个观察程序函数:
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 中。
我在IE 10中遇到了问题。我正在使用
window.location.href = '#/';
用于更改路线。将其替换为 以下代码
$location.path('/');
解决了问题
TLDR
如果您正在使用ui-router
那么您也可以使用
$state.go('details', {id:item.ID});
背景
我使用以下函数从列表视图导航到详细信息视图,以便您可以单击任何带有 ng-click="details(item)"
的内容,就我而言,tr
在列表中:
$scope.details = function (item) {
$window.location.href = "#/details/" + item.ID;
}
但是我在IE中得到了可怕的10 $digest() iterations reached
。
仅供参考
我在 AngularJS v1.2.0rc1 angular 中放置了一个断点.js在 Tiago 的回答之后的第 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;
});
结果
铬的输出
- 断点仅在加载详细信息页面后命中,并且仅命中一次。
-
oldUrl
(即$browser.url()
报告旧网址(即列表网址) -
$location.absUrl()
报告了详细信息 URL。
从 IE7,8 输出
- 断点连续命中。
-
oldUrl
(即$browser.url()
报告了新网址(即详细信息网址) -
$location.absUrl()
仍在报告列表 URL。
我在尝试重定向到其他页面时遇到了这个问题
$window.location.href = '#/path/'
通过更改为解决:
$location.path('/path/');