Wszystkie powyższe odpowiedzi psują oczekiwane zachowanie przeglądarki. Większość ludzi chce czegoś, co przewinie na górę, jeśli jest to „nowa” strona, ale wróci do poprzedniej pozycji, jeśli przejdziesz tam za pomocą przycisku Wstecz (lub Dalej).
Jeśli przyjmiesz tryb HTML5, okaże się to łatwe (chociaż jestem pewien, że niektórzy bystrzy ludzie mogą dowiedzieć się, jak uczynić to bardziej eleganckim!):
// Called when browser back/forward used
window.onpopstate = function() {
$timeout.cancel(doc_scrolling);
};
// Called after ui-router changes state (but sadly before onpopstate)
$scope.$on('$stateChangeSuccess', function() {
doc_scrolling = $timeout( scroll_top, 50 );
// Moves entire browser window to top
scroll_top = function() {
document.body.scrollTop = document.documentElement.scrollTop = 0;
}
Działa to tak, że router zakłada, że przewinie się do góry, ale nieco opóźnia, aby dać przeglądarce szansę na zakończenie. Jeśli przeglądarka powiadomi nas wtedy, że zmiana była spowodowana nawigacją wstecz / do przodu, anuluje limit czasu i przewijanie nigdy nie nastąpi.
Użyłem surowych document
poleceń do przewijania, ponieważ chcę przenieść się na całą górę okna. Jeśli chcesz tylko ui-view
przewijać, ustaw miejsce, w autoscroll="my_var"
którym kontrolujesz, my_var
korzystając z powyższych technik. Ale myślę, że większość ludzi będzie chciała przewinąć całą stronę, jeśli przejdziesz na stronę jako „nową”.
Powyższych zastosowań UI-routera, choć można użyć NG-trasę zamiast poprzez zamianę $routeChangeSuccess
na $stateChangeSuccess
.