Перенаправление с использованием 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
82

Не забудьте ввести $locationв контроллер.

Степан Суворов
источник
2
Хороший улов - это была проблема для меня.
Джейсон Светт
Хороший, спасибо, что разместили это, то, что казалось таким очевидным, не было.
Чак Конвей
20

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

dpactri
источник
15

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

Raulucco
источник
2

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

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

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

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

$location.path("/app/register");
Jfindley
источник
0

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

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

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

Милан Ярич
источник