我在使用角度应用程序中的pushState()更改浏览器URL时出错

时间:2014-08-28 01:47:49

标签: angularjs pushstate

我需要在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)

1 个答案:

答案 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的, “'”);但这可能会导致不必要的副作用。