AngularJS - Jak zrobić przekierowanie przy pełnym załadowaniu strony?

94

Chcę wykonać przekierowanie, które powoduje ponowne załadowanie całej strony, aby pliki cookie z mojego serwera WWW były odświeżane podczas ładowania strony. window.location = "/#/Next"i window.location.href = "/#/Next"nie działają, wykonują trasę Angular, która nie trafia do serwera.

Jaki jest poprawny sposób wysyłania pełnego żądania serwera w kontrolerze Angular?

Mike Pateras
źródło
8
czy kiedykolwiek to rozwiązałeś?
superjos
7
czy kiedykolwiek to rozwiązałeś?
Nolwennig
6
czy kiedykolwiek to rozwiązałeś?
Dan Beaulieu
5
czy kiedykolwiek to rozwiązałeś?
My Stack Overfloweth
4
czy kiedykolwiek to rozwiązałeś?
shahzain ali

Odpowiedzi:

183

Dla <a>tagów :

Musisz przykleić target="_self"swój <a>tag

Istnieją trzy przypadki, w których AngularJS przeładuje całą stronę:

  • Linki zawierające element docelowy
    Przykład:<a href="https://stackoverflow.com/ext/link?a=b" target="_self">link</a>
  • Bezwzględne linki prowadzące do innej domeny
    Przykład:<a href="http://angularjs.org/">link</a>
  • Linki zaczynające się od „/”, które prowadzą do innej ścieżki bazowej, gdy baza jest zdefiniowana
    Przykład:<a href="https://stackoverflow.com/not-my-base/link">link</a>

Korzystanie z javascript :

$locationUsługa pozwala na zmianę jedynie URL; nie pozwala na ponowne załadowanie strony. Kiedy trzeba zmienić adres URL i odświeżyć stronę lub przejdź do innej strony, należy użyć niższym poziomie API: $window.location.href.

Widzieć:

jszobody
źródło
15
$ window.location.href robi to samo, co window.location.href. Jestem prawie pewien, że $ window to tylko usługa zawijania okna. Tak czy inaczej, oba wykonują trasę kątową zamiast pełnego odświeżania strony.
Mike Pateras
3
$ window.location.href zdecydowanie powoduje pełne odświeżenie strony, robię to w mojej aplikacji.
jszobody
3
Czytałem to samo. Nie działa w aktualnej wersji Chrome. Robi trasę kątową.
Mike Pateras
1
1.0.6 z CDN. Robię to w ramach wywołania zwrotnego $ http.post sukcesu, jeśli ma to znaczenie, chociaż próbowałem tego poza wywołaniem zwrotnym i otrzymałem te same wyniki. Jeśli wykonam przekierowanie do „/” (dla którego mam również zdefiniowaną trasę kątową), działa to z pełnym odświeżeniem strony, ale „/ # / Next” po prostu zmienia widok.
Mike Pateras,
5
<a href="..." target="_self">to działa dla mnie. dzięki !
Michael
33

Mieliśmy ten sam problem, pracując z kodem JS (tj. Nie z kotwicy HTML). Oto jak rozwiązaliśmy ten problem:

  1. W razie potrzeby wirtualnie zmień bieżący adres URL za pośrednictwem $locationusługi. Może to być przydatne, jeśli miejsce docelowe jest tylko odmianą bieżącego adresu URL, aby można było skorzystać z $locationmetod pomocniczych. Np $location.search(..., ...). Pobiegliśmy po prostu zmienić wartość parametru querystring.

  2. Utwórz nowy docelowy adres URL, używając aktualnego, $location.url()jeśli to konieczne. Aby działał, ten nowy musiał zawierać wszystko po schemacie, domenie i porcie. Czyli np. Jeśli chcesz przenieść się do:

    http://yourdomain.com/YourAppFolder/YourAngularApp/#/YourArea/YourAction?culture=en

    wtedy powinieneś ustawić URL jak w:

    var destinationUrl = '/YourAppFolder/YourAngularApp/#/YourArea/YourAction?culture=en';

    (również z prowadzeniem '/').

  3. Przypisz nowy docelowy adres URL na niskim poziomie :$window.location.href = destinationUrl;

  4. Wymuś przeładowanie, wciąż na niskim poziomie: $window.location.reload();

superjos
źródło
1
To nie działa dla mnie w Angular 1.3.1 z Chrome 38. Wartość $ window.location.href nie zmienia się, gdy przypisuję ścieżkę lub pełny adres URL. U mnie działała tylko $ window.location. assign ().
FelixM
Mając te same problemy co Felix, rozwiązałem je w inny sposób stackoverflow.com/questions/31137809/…
Soroush Hakami
13

Po wyszukaniu i podaniu trafienia i sesji próbnej jestem w stanie rozwiązać ten problem, podając najpierw adres URL

$window.location.href = '/#/home/stats';

następnie załaduj ponownie

$window.location.reload();
Daniyal
źródło
Wydaje się, że rozwiązuje to problem, ale klikanie wstecz i dalej w przeglądarce spowoduje wiele niespójności.
luisluix,
9

Miałem ten sam problem. Kiedy używam window.location, $window.locationczy nawet <a href="..." target="_self">trasa nie odświeża strony. Więc używane są usługi buforowane, co nie jest tym, czego chcę w mojej aplikacji. Rozwiązałem to, dodając window.location.reload()po, window.locationaby wymusić ponowne załadowanie strony po routingu. Ta metoda wydaje się jednak ładować stronę dwukrotnie. Może to być brudna sztuczka, ale działa. Oto jak mam to teraz:

  $scope.openPage = function (pageName) {
      window.location = '#/html/pages/' + pageName;
      window.location.reload();
  };
Neel
źródło
1

Spróbuj tego

$window.location.href="#page-name";
$window.location.reload();
Suresh Maurya
źródło