27

我是 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();\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 之外的任何其他浏览器上,我应该怎么做才能摆脱它。提前致谢。

4

7 回答 7

30

Tiago Roldão 绝对正确。我有完全相同的问题。调试后,我在我的代码中意识到我有

location.hash = "#/app/" + id;

这会导致无限循环问题。经过一番研究,我发现了这个

$location.path("/apps/" + id);

完美解决了我的问题。

于 2013-08-08T23:55:27.000 回答
22

我遇到了相同的错误问题,看起来相同。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>

对于类似的情况,可能最好使用 span 或 div。

于 2013-08-07T14:15:39.993 回答
17

在调用 $window.history.back() 时(尤其是在 Windows Phone 中),我在 IE9、IE10 中使用 AngularJS v1.2.13 时遇到了同样的问题。

似乎根本原因是 IE 中的 $window.history.back() 在 $locationWatch() 被触发之前更改了 href,因此 oldUrl 将包含新的 Url,并且将角度抛出到无限的 $digest 中。

立即解决的方法是将调用 $window.history.back() 替换为以下内容:

setTimeout(function () 
{
    $window.history.back();
}, 0);
于 2014-05-28T15:32:34.953 回答
5

我可以从您的错误报告中看出您有一个用于 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 中不匹配。

于 2012-12-13T12:08:54.423 回答
3

我在 IE 10 中遇到问题。我正在使用

window.location.href = '#/';

用于更改路线。用下面的代码替换它

$location.path('/');

解决了这个问题

于 2015-05-22T12:02:25.393 回答
2

TLDR

如果您正在使用,ui-router那么您也可以使用

$state.go('details', {id:item.ID});

背景

我正在使用以下功能从列表视图导航到详细信息视图,以便您可以单击任何带有 的内容ng-click="details(item)",在我的情况下tr是在列表中:

$scope.details = function (item) {
    $window.location.href = "#/details/" + item.ID;
}

10 $digest() iterations reached但我在 IE中感到恐惧。

供参考

在 Tiago 的回答之后,我在 AngularJS v1.2.0rc1 angular.js line 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;
});

结果

来自 Chrome 的输出

  • 断点仅在加载详细信息页面时被击中,并且只有一次。
  • oldUrl(即$browser.url()报告旧网址(即列表一)
  • $location.absUrl()正在报告详细信息网址。

来自 IE7,8 的输出

  • 断点被连续击中。
  • oldUrl(即$browser.url()报告新网址(即详细信息之一)
  • $location.absUrl()仍在报告列表网址。
于 2013-12-11T12:29:56.417 回答
0

我在尝试重定向到其他页面时遇到了这个问题

$window.location.href = '#/path/'

通过更改为解决:

$location.path('/path/');
于 2017-09-13T19:41:02.237 回答