Перенаправление с использованием AngularJS


86

Я пытаюсь перенаправить на другой маршрут, используя:

$location.path("/route");

Но почему-то не работает. Я создал виджет с автозаполнением, используя jQuery-UI, и я вызываю функцию из области видимости, когда пользователь выбирает вариант. Я отлаживал его, и он входит в функцию, но никогда не перенаправляется на другой маршрут. Он меняет маршрут только тогда, когда я нажимаю клавишу.

Я думаю, что это немного странно, но я не понял, как это решить. я использовал

window.location = "#/route";

и он работает, но я хочу использовать эту path()функцию.

Кто-нибудь знает, почему это происходит?

Ответы:


109

На примере неработающего кода будет легко ответить на этот вопрос, но с этой информацией лучшее, что я могу придумать, - это то, что вы вызываете $ location.path вне дайджеста AngularJS.

Попробуйте сделать это по директиве scope.$apply(function() { $location.path("/route"); });


Большое спасибо, и мне очень жаль, что я не разместил неработающий пример. Но это было то, что нужно моему коду.
Tomarto

23
Есть идеи, как заставить это работать в методе .success внутри запроса $ http? @Tomarto
Николас Крейдберг

2
на консоли firefox (30 ~)
выдает

1
Как это должно работать? Я получаю следующую ошибку: Ошибка: [$ rootScope: inprog] $ применить уже в процессе ошибок .angularjs.org/1.2.15/$ rootScope/ inprog? p0= % 24применить в angular.js: 78 ..... следовательно, он не работает как windows.location = '' ..
Вайбхав

1
@NicholasKreidberg задал тот же вопрос, просто добавив $ scope. $ Apply (); сразу после $ location.path ("/ route"); работал у меня.
Эрнесто Аллели 07


20

Предполагая, что вы не используете маршрутизацию html5, попробуйте $location.path("route"). Это перенаправит ваш браузер на #/routeто, что вы хотите.


15

Если вам нужно перенаправить из вашего приложения angular, используйте $window.location. Это был мой случай; надеюсь, кому-то это будет полезно.


2

Проверьте свой метод маршрутизации:

если ваше состояние маршрутизации такое

 .state('app.register', {
    url: '/register',
    views: {
      'menuContent': {
        templateUrl: 'templates/register.html',
      }
    }
  }) 

тогда вы должны использовать

$location.path("/app/register");

0

Трудно сказать, не зная вашего кода. Я предполагаю, что onchangeсобытие не запускается, когда вы меняете значение текстового поля из кода JavaScript.

Это может работать двумя способами; первый - вызвать onchangeсамостоятельно, а второй - дождаться, пока текстовое поле потеряет фокус.

Отметьте этот вопрос ; та же проблема, разные рамки.

Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.