Angular 在 Safari Mobile 上保存凭据提示后出现 infdig 异常

Angular infdig Exception After Save Credential Prompt on Safari Mobile

每次出现 Safari Mobile 保存凭据提示时,我都遇到以下 AngularJS 异常:

[Error] Error: [$rootScope:infdig] 10 $digest() iterations reached.   Aborting!
Watchers fired in the last 5 iterations: []
http://errors.angularjs.org/1.3.10/$rootScope/infdig?p0=10&p1=%5B%5D
$digest@https://ajax.googleapis.com/ajax/libs/angularjs/1.3.10/angular.js:14271:31
$apply@https://ajax.googleapis.com/ajax/libs/angularjs/1.3.10/angular.js:14493:31
https://ajax.googleapis.com/ajax/libs/angularjs/1.3.10/angular.js:21402:29
eventHandler@https://ajax.googleapis.com/ajax/libs/angularjs/1.3.10/angular.js:3011:25
    (anonymous function) (angular.js, line 11598)
    (anonymous function) (angular.js, line 8548)
    $apply (angular.js, line 14495)
    (anonymous function) (angular.js, line 21402)
    eventHandler (angular.js, line 3011)
[Error] Error: [$rootScope:infdig] 10 $digest() iterations reached.  Aborting! (angular.js, line 14271)
Watchers fired in the last 5 iterations: []
http://errors.angularjs.org/1.3.10/$rootScope/infdig?p0=10&p1=%5B%5D

我已经能够在这个 plnkr 中复制这个问题:http://plnkr.co/edit/tkGGtxGRnWrfQUprDqjb。这似乎是在 Safari Mobile 中实现保存凭据提示的方式的结果,因为我没有在任何其他浏览器中看到它。此外,如果我保存凭据以便不出现提示,我就不会收到错误。该页面在出现异常后似乎正常运行,因此我可以捕获此异常并忽略它,但我希望有更好的解决方案。

我发现避免此异常的唯一方法是在返回登录名的 ajax 调用后重新加载页面。进行此更改还为其他浏览器密码管理器提供了更多支持,因为有些浏览器密码管理器需要触发页面刷新。为了触发页面更改并从我的 angular 控制器中重新加载,我使用了以下代码:

$window.location.href = '#/mypage';
$window.location.reload();