window.location.href/reload вызывает AngularJS [$rootScope:infdig] 10 итераций $digest()

Я знаю, что это вызывает проблему, как если бы я изменил window.location.href/reload на $location.path(), все работает нормально. Теперь я не вижу ошибок производительности при запуске кода (юзабилити) Шучу, это ломает приложение в IE, но работает в Chrome при использовании window.

Что я делаю, так это заставляю некоторые обновления отражаться на сайте, когда пользователь входит/выходит из системы, и для этого мне нужно обновить страницу, как только я изменю их маршрут. Используя $location.path и $state.go, измените мой URL-адрес, но не перезагружайте/не обновляйте страницу, чтобы отражать обновления сайта.

Есть ли способ для AngularJS изначально перенаправить и перезагрузить маршрут/страницу без предупреждения/ошибки этого цикла? Или есть способ по-прежнему использовать window.location.href/reload, а теперь заставить AngularJS сходить с ума?

Ошибка

Ошибка: [$rootScope:infdig] достигнуто 10 итераций $digest(). Прерывание!

Watchers fired in the last 5 iterations: [["fn: function $locationWatch() {\n var oldUrl = $browser.url();\n var currentReplace = $location.$$replace;\n\n if (!changeCounter || oldUrl != $location.absUrl()) {\n changeCounter++;\n
$rootScope.$evalAsync(function() {\n if ($rootScope.$broadcast('$locationChangeStart', $location.absUrl(), oldUrl).\n defaultPrevented) {\n
$location.$$parse(oldUrl);\n } else {\n
$browser.url($location.absUrl(), currentReplace);\n
afterLocationChange(oldUrl);\n }\n });\n }\n
$location.$$replace = false;\n\n return changeCounter;\n }; newVal: 8; oldVal: 7","fn: function(context) {\n try {\n
for(var i = 0, ii = length, part; i

And then there is a paragraph-long error below those starting with:

[$rootScope:infdig] Достигнуто 10 итераций $digest(). Прерывание! Наблюдатели сработали за последние 5 итераций....


person Austin    schedule 19.03.2015    source источник


Ответы (2)


Вы можете попробовать заменить href внутри setTimeout. Это помогло в моем случае.

$setTimeout(function() { $window.location.href = newUrl; }, 500);
person Monsignor    schedule 04.09.2015

$state на самом деле имеет функцию reload(), которая делает именно это:

$state.reload();

Вы можете прочитать об этом в ui-router $state документы.

Если вам также нужно перенаправить, вы можете принудительно перезагрузить при переходе состояния, передав параметр reload: true в $state.go():

$state.go('stateName', {}, {reload: true});

person javamonn    schedule 19.03.2015
comment
Нужно ли тогда добавлять ui-router только для этой функции? - person Austin; 19.03.2015
comment
В ваших вопросах упоминается использование $state.go(), я предполагал, что вы уже используете его. Если нет, Angular также предоставляет сервис $route, который обеспечивает аналогичную функциональность. Вставьте его в свой контроллер и вызовите $route.reload() там, где вам нужно. - person javamonn; 19.03.2015
comment
Я пытался поместить $route.reload в контроллеры, но он никогда не срабатывает. :/ - person Austin; 19.03.2015