Использование history.pushState в Angular приводит к 10 итерациям $digest(). Прерывание! ошибка

Я пытаюсь изменить URL-адрес в своем приложении с "http://www.test.com/foo" на "http://www.test.com/bar+someVariable" (somevariable — это строка, которую я получаю из http-запроса внутри контроллера панели) с помощью history.pushState() . В своих маршрутах я включил html5mode и все работает нормально. Я также использую location.path() для переключения между представлениями и контроллерами, как указано в документации. Теперь, когда приложение переключает вид и контроллер, я добавил history.pushState(null,null,"/bar"+somevariable) в контроллер "/bar". Все работает, и URL-адрес обновляется, но в консоли я получаю сообщение «Достигнуто 10 итераций $digest(). Прерывание!» ошибка. Я подозреваю, что активация функции history.pushState каким-то образом мешает службе angular $location или $route.

Как правильно использовать history.pushState() в angular без получения ошибки $digest?

Кстати, я использую angular 1.0.3.

Спасибо вперед, Гидон


person Gidon    schedule 18.12.2013    source источник
comment
У меня такая же проблема, когда я делаю какие-то причудливые вещи с динамическими включениями и динамически добавляемыми контроллерами. Несмотря на то, что все работает нормально, как только я использую, pushState все портится.   -  person Domi    schedule 21.05.2014


Ответы (2)


Измените путь с помощью

$location.path('/newValue')

См.: http://docs.angularjs.org/guide/dev_guide.services.%24location

person oori    schedule 18.12.2013
comment
Привет, оори, я уже использую $location.path(). Я пытаюсь изменить URL-адрес пути на что-то новое после перенаправления. Например, используя то, что вы предоставили, я хотел бы направить приложение на /newValue, но в URL-адресе я хотел бы видеть /newValue/someVariable, а также иметь возможность изменить someVariable в соответствии с данными, полученными с сервера. Вы знаете, как этого добиться? - person Gidon; 18.12.2013
comment
Я не совсем уверен, что понял ваш запрос, может быть, вы могли бы сделать простой jsfiddle/plunkr для этого примера? Я имею в виду, что если URL-адрес установлен на /x, а затем на /x/y, то, естественно, он маршрутизируется Angular, и срабатывает $routeProvider. Вы можете перехватывать эти маршруты там и останавливать/манипулировать ими. - person oori; 19.12.2013

Трудно сказать наверняка, не видя соответствующего источника, но это распространенная проблема в старых версиях IE (в основном, я думаю, 8 и 9). Решение, которое сработало для меня несколько недель назад, когда я столкнулся с этим (и может сработать для вас, если вы используете IE), заключалось в изменении тегов привязки в моей навигации.

Я имел:

<a href="#"></a>

что исправил:

<a href=""></a>
person Jake Johnson    schedule 18.12.2013