Znalazłem jakieś niepożądane, przynajmniej dla mnie, zachowanie podczas zmiany trasy. W kroku 11 samouczka http://angular.github.io/angular-phonecat/step-11/app/#/phones możesz zobaczyć listę telefonów. Jeśli przewiniesz na dół i klikniesz jeden z najnowszych, zobaczysz, że zwoju nie ma na górze, a raczej w środku.
Znalazłem to również w jednej z moich aplikacji i zastanawiałem się, jak mogę to przewinąć do góry. Mogę to zrobić ręcznie, ale uważam, że powinien istnieć inny elegancki sposób, którego nie znam.
Czy istnieje elegancki sposób przewijania na górę, gdy zmienia się trasa?
źródło
<div class="ng-view" autoscroll></div>
i działa on tak samo (chyba że chcesz uzależnić przewijanie).$window.scrollTo(0,0)
w nasłuchiwaniu zdarzeń $ stateChangeSuccessPo prostu uruchom ten kod
źródło
$window.scrollTop(0,0)
działa dla mnie lepiej niż automatyczne przewijanie. W moim przypadku mam widoki, które wchodzą i wychodzą z przejściami.Ten kod działał świetnie dla mnie .. Mam nadzieję, że będzie również działał świetnie dla Ciebie .. Wszystko, co musisz zrobić, to po prostu wstrzyknąć $ anchorScroll do bloku uruchamiania i zastosować funkcję detektora do rootScope, jak to zrobiłem w poniższym przykładzie ..
Oto kolejność wywoływania modułu Angularjs:
app.config()
app.run()
directive's compile functions (if they are found in the dom)
app.controller()
directive's link functions (again, if found)
RUN BLOCK jest wykonywany po utworzeniu wtryskiwacza i służy do uruchomienia aplikacji. Oznacza to, że po przekierowaniu do nowego widoku trasy słuchacz w bloku uruchamiania wywołuje metodę
i możesz teraz zobaczyć, że przewijanie zaczyna się na górze z nowym widokiem trasy :)
źródło
Po godzinie lub dwóch prób każdą kombinację
ui-view autoscroll=true
,$stateChangeStart
,$locationChangeStart
,$uiViewScrollProvider.useAnchorScroll()
,$provide('$uiViewScroll', ...)
, i wiele innych, nie mogłem dostać zwój-to-top-on-nowej stronie, aby działać zgodnie z oczekiwaniami.To ostatecznie działało dla mnie. Przechwytuje pushState i replaceState i aktualizuje pozycję przewijania tylko po przejściu do nowych stron (przycisk Wstecz / Dalej zachowuje pozycje przewijania):
źródło
$locationProvider.html5Mode(true);
@wkronkel jest sposób, aby to zrobić, gdy nie używasz trybu HTML5 w wersji kątowej?.run
? kątowy twójapp
obiekt?run
funkcja jest metodą dostępną na każdym obiekcie modułu kątowego.Oto moje (pozornie) solidne, kompletne i (dość) zwięzłe rozwiązanie. Wykorzystuje styl zgodny z minimalizacją (i dostęp do modułu angular.module (NAME)).
PS Odkryłem, że funkcja automatycznego przewijania nie miała żadnego wpływu, czy jest ustawiona na prawda czy fałsz.
źródło
Używając routera interfejsu użytkownika angularjs, robię to:
Z:
Nigdy nie zawodzi na żadnej stronie i nie jest globalny.
źródło
onEnter: scrollContent
// Your favorite scroll method here
?$('html, body').animate({ scrollTop: -10000 }, 100);
onEnter: scrollContent
na każdym widoku, działa tylko na pierwszym widoku / trasie, a nie na drugim. Dziwne.Informacje dla każdego, kto napotka problem opisany w tytule (tak jak ja), który również korzysta z wtyczki AngularUI Router ...
Zgodnie z pytaniem i odpowiedzią na to pytanie SO router angular-ui przeskakuje na dół strony podczas zmiany tras.
Nie możesz dowiedzieć się, dlaczego strona ładuje się na dole? Problem automatycznego przewijania Angular UI-Router
Jednak, jak mówi odpowiedź, możesz wyłączyć to zachowanie, mówiąc
autoscroll="false"
na swoimui-view
.Na przykład:
http://angular-ui.github.io/ui-router/site/#/api/ui.router.state.directive:ui-view
źródło
możesz użyć tego javascript
źródło
$location.hash('top')
przed$anchorScroll()
domyślnymi przyciskami przeglądarki do przodu / do tyłu, przestaną działać; przekierowują cię do skrótu w adresie URLJeśli używasz interfejsu użytkownika routera, możesz go używać (podczas uruchamiania)
źródło
Znalazłem to rozwiązanie. Jeśli przejdziesz do nowego widoku, funkcja zostanie wykonana.
źródło
Ustawienie autoScroll na wartość true nie było dla mnie problemem, więc wybrałem inne rozwiązanie. Zbudowałem usługę, która zaczepia się za każdym razem, gdy zmienia się trasa i która korzysta z wbudowanej usługi $ anchorScroll do przewijania na górę. Pracuje dla mnie :-).
Usługa:
Rejestracja:
źródło
Trochę późno na imprezę, ale wypróbowałem każdą możliwą metodę i nic nie działało poprawnie. Oto moje eleganckie rozwiązanie:
Używam kontrolera, który zarządza wszystkimi moimi stronami za pomocą interfejsu użytkownika. Pozwala mi przekierowywać użytkowników, którzy nie są uwierzytelnieni lub zatwierdzeni do odpowiedniej lokalizacji. Większość ludzi umieszcza swoje oprogramowanie pośrednie w konfiguracji aplikacji, ale wymagałem kilku żądań HTTP, dlatego globalny kontroler działa dla mnie lepiej.
Mój index.html wygląda następująco:
Mój initCtrl.js wygląda następująco:
Wypróbowałem każdą możliwą opcję, ta metoda działa najlepiej.
źródło
id="top-nav"
ważne było również umieszczenie odpowiedniego elementu.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!):
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 tylkoui-view
przewijać, ustaw miejsce, wautoscroll="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
.źródło
var routerApp = angular.module('routerApp', ['ui.router']); routerApp.config(function($stateProvider, $urlRouterProvider, $locationProvider) { $urlRouterProvider.otherwise('/home'); $locationProvider.html5Mode(false).hashPrefix(""); $stateProvider // HOME STATES AND NESTED VIEWS ======================================== .state('home', { url: '/home', templateUrl: 'partial-home.html' }) });
.state('web', { url: '/webdev', templateUrl: 'partial-web.html', controller: function($scope) { $scope.clients = ['client1', 'client2', 'client3']; // I put it here } })
Właśnie się tego uczę, może coś mi umknęło: DŻadna z podanych odpowiedzi nie rozwiązała mojego problemu. Używam animacji między widokami, a przewijanie zawsze odbywa się po animacji. Rozwiązaniem, które znalazłem, aby przewinięcie do góry nastąpiło przed animacją, jest następująca dyrektywa:
Wstawiłem go do mojego widoku w następujący sposób:
źródło
Proste rozwiązanie, dodaj
scrollPositionRestoration
włączony główny moduł trasy.Lubię to:
źródło
Spróbuj tego http://ionicframework.com/docs/api/service/ $ ionicScrollDelegate /
Przewija do góry listy scrollTop ()
źródło
W końcu dostałem to, czego potrzebowałem.
Musiałem przewinąć na górę, ale chciałem, żeby niektóre przejścia tego nie zrobiły
Możesz to kontrolować na poziomie trasy po trasie.
Łączę powyższe rozwiązanie przez @wkonkel i dodam prosty
noScroll: true
parametr do niektórych deklaracji trasy. Potem łapię to w trakcie przejścia.Podsumowując: To unosi się na górę strony przy nowych przejściach, nie unosi się na górę na
Forward
/Back
przejściach i pozwala zastąpić to zachowanie, jeśli to konieczne.Kod: (poprzednie rozwiązanie plus dodatkowa opcja noScroll)
Włóż to do swojego
app.run
bloku i wstrzyknij$state
...myApp.run(function($state){...})
Następnie, jeśli nie chcesz przewijać do góry strony, utwórz trasę taką jak ta:
źródło
To działało dla mnie, w tym automatyczne przewijanie
<div class="ngView" autoscroll="true" >
źródło