Przekierowanie za pomocą AngularJS

86

Próbuję przekierować na inną trasę używając:

$location.path("/route");

Ale z jakiegoś powodu to nie działa. Zrobiłem widget autouzupełniania przy użyciu jQuery-UI i wywołuję funkcję z zakresu, gdy użytkownik wybierze opcję. Debugowałem go i wchodzi do funkcji, ale nigdy nie jest przekierowywany na inną trasę. Zmienia trasę tylko po naciśnięciu klawisza.

Myślę, że to trochę dziwne, ale nie wymyśliłem, jak to rozwiązać. użyłem

window.location = "#/route";

i działa, ale chcę użyć tej path()funkcji.

Czy ktoś ma pojęcie, dlaczego tak się dzieje?

Tomarto
źródło

Odpowiedzi:

109

Na przykładzie niedziałającego kodu łatwo będzie odpowiedzieć na to pytanie, ale dzięki tym informacjom najlepsze, co mogę pomyśleć, to wywołanie $ location.path poza skrótem AngularJS.

Spróbuj zrobić to na dyrektywie scope.$apply(function() { $location.path("/route"); });

Renan Tomal Fernandes
źródło
Bardzo dziękuję i przepraszam, że nie opublikowałem niedziałającego przykładu. Ale właśnie tego potrzebował mój kod.
Tomarto
23
Masz pomysł, jak to zadziałać w metodzie .success w żądaniu $ http? @Tomarto
Nicholas Kreidberg,
2
na konsoli firefox (30 ~) uruchamia się błąd, że cykl $ Apply jest zajęty
svarog
1
Jak to ma działać? Otrzymuję następujący błąd: Błąd: [$ rootScope: inprog] $ zastosuj już w toku errors.angularjs.org/1.2.15/$rootScope/inprog?p0=%24apply at angular.js: 78 ..... w związku z tym nie działa jako windows.location = '' ..
Vaibhav
1
@NicholasKreidberg miał to samo pytanie i po prostu dodał $ scope. $ Apply (); zaraz po $ location.path ("/ route"); pracował dla mnie.
Ernesto Allely
82

Nie zapomnij wstrzyknąć $locationdo kontrolera.

Stepan Suvorov
źródło
2
Niezły haczyk - to był dla mnie problem.
Jason Swett
Niezłe, dziękuję za opublikowanie tego, co wydawało się tak oczywiste, nie było.
Chuck Conway,
20

Zakładając, że nie używasz routingu html5, spróbuj $location.path("route"). Spowoduje to przekierowanie przeglądarki do #/routetego, czego chcesz.

dpactri
źródło
15

Jeśli potrzebujesz przekierować z aplikacji kątowej, użyj $window.location. To był mój przypadek; miejmy nadzieję, że ktoś uzna to za przydatne.

Raulucco
źródło
2

Sprawdź swoją metodę routingu:

jeśli twój stan routingu jest taki

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

wtedy powinieneś użyć

$location.path("/app/register");
jfindley
źródło
0

Trudno powiedzieć bez znajomości kodu. Domyślam się, że onchangezdarzenie nie jest uruchamiane po zmianie wartości pola tekstowego z kodu JavaScript.

Są na to dwa sposoby; pierwszy to dzwonienie onchangesamemu, a drugi to czekanie, aż pole tekstowe straci ostrość.

Sprawdź to pytanie ; ten sam problem, inne ramy.

Milan Jaric
źródło