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?

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"); });


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


20

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


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.


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");

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.

Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.