我需要在angularJs应用程序中打开bootstrap模式时更改浏览器URL,我使用pushState()
函数,url已更改,但它会引发以下错误:
Uncaught Error: [$rootScope: infdig] 10 $digest() iterations reached.Aborting!
Watchers fired in the last 5 iterations: [
["fn: $locationWatch; newVal: 8; oldVal: 7"],
["fn: $locationWatch; newVal: 9; oldVal: 8"],
["fn: $locationWatch; newVal: 10; oldVal: 9"],
["fn: $locationWatch; newVal: 11; oldVal: 10"],
["fn: $locationWatch; newVal: 12; oldVal: 11"]
]
http: //errors.angularjs.org/1.2.13/$rootScope/infdig?p0=10&p1=%5B%5B%22fn%3…2fn%3A%20%24locationWatch%3B%20newVal%3A%2012%3B%20oldVal%3A%2011%22%5D%5D angular-1.2.13.js:78
(anonymous function) angular-1.2.13.js:78
Scope.$digest angular-1.2.13.js:11937
(anonymous function) angular-1.2.13.js:12084
completeOutstandingRequest angular-1.2.13.js:4144
(anonymous function)
答案 0 :(得分:4)
这是角度为$location
服务的错误。它刚刚在2014年8月27日的Angular 1.3.0-beta.20的最新版本中修复。请参阅问题3924和重复的6976,这已归入修复程序。
angular-ui团队提供了临时修复的文档:https://github.com/angular-ui/ui-router/issues/562#issuecomment-31623003
问题是由于Angular没有同步通知浏览器网址的更改,并且信任其在$ browser.url()中的网址缓存版本。由于$ browser.url()作为getter是幂等的,它会不断更新真正的url,而不更新url的内部记录。
要验证这是否为真,请在window.history.replaceState行之后的提供的测试中添加此行,测试将通过:angular.element($ window).triggerHandler('popstate');
通过在url getter中重置lastBrowserUrl,可以很容易地修复$浏览器中的一行:lastBrowserUrl = newLocation || location.href.replace(/%27 / g的, “'”);但这可能会导致不必要的副作用。