Das Ändern der Route scrollt auf der neuen Seite nicht nach oben
Lesezeit: 6 Minuten
Matias Gonzales
Ich habe ein unerwünschtes Verhalten festgestellt, zumindest für mich, wenn sich die Route ändert. In Schritt 11 des Tutorials http://angular.github.io/angular-phonecat/step-11/app/#/phones
Sie können die Liste der Telefone sehen. Wenn Sie nach unten scrollen und auf eine der neuesten klicken, können Sie sehen, dass die Schriftrolle nicht oben ist, sondern eher in der Mitte.
Ich habe das auch in einer meiner Apps gefunden und mich gefragt, wie ich das nach oben scrollen kann. Ich kann es manuell tun, aber ich denke, dass es einen anderen eleganten Weg geben sollte, den ich nicht kenne.
Gibt es also eine elegante Möglichkeit, nach oben zu scrollen, wenn sich die Route ändert?
Das Problem ist, dass Sie ngView behält die Bildlaufposition beim Laden einer neuen Ansicht bei. Sie können anweisen $anchorScroll um “im Ansichtsfenster zu scrollen, nachdem die Ansicht aktualisiert wurde” (die Dokumente sind etwas vage, aber scrollen bedeutet hier nach oben scrollen der neuen Ansicht).
Die Lösung ist hinzuzufügen autoscroll="true" zu Ihrem ngView-Element:
<div class="ng-view" autoscroll="true"></div>
Das funktioniert für mich, die Seite scrollt gut nach oben, aber ich verwende scrollTo mit der smoothScroll-Direktive, gibt es eine Möglichkeit, ein glattes Scrollen nach oben zu machen? Zusätzlich scrollt Ihre Lösung nach oben, nicht auf die Seite, zu der gescrollt werden kann ganz oben auf der Seite?
– xzegga
20. Dezember 2014 um 20:18 Uhr
Die Dokumente besagen Wenn das Attribut ohne Wert gesetzt ist, aktivieren Sie das Scrollen. So können Sie den Code nur verkürzen <div class="ng-view" autoscroll></div> und es funktioniert genauso (es sei denn, Sie wollten das Scrollen bedingt machen).
– Daniel Liuzzi
31. Dezember 2014 um 3:55 Uhr
es funktioniert nicht für mich, das Dokument sagt nicht, dass es nach oben scrollen wird
– Bleistiftcheck
13. Januar 2015 um 6:17 Uhr
Ich finde, wenn Autoscroll auf „true“ gesetzt ist, kehrt ein Benutzer zum Anfang der Seite zurück, wenn er „zurückgeht“, und nicht dorthin, wo er sie verlassen hat, was ein unerwünschtes Verhalten ist.
– axzr
27. Januar 2015 um 10:49 Uhr
Dadurch wird Ihre Ansicht zu diesem Div gescrollt. Es wird also nur dann zum Anfang der Seite gescrollt, wenn es sich zufällig oben auf der Seite befindet. Sonst musst du rennen $window.scrollTo(0,0) im $stateChangeSuccess-Ereignis-Listener
– Filip Sobczak
14. Oktober 2015 um 15:13 Uhr
xmaster
Setzen Sie einfach diesen Code zum Ausführen ein
$rootScope.$on("$routeChangeSuccess", function (event, currentRoute, previousRoute) {
window.scrollTo(0, 0);
});
$window.scrollTop(0,0)Funktioniert bei mir besser als Autoscroll. In meinem Fall habe ich Ansichten, die mit Übergängen ein- und ausgehen.
– IsidroGH
21. Dezember 2014 um 15:32 Uhr
Das funktioniert bei mir auch besser als autoscroll=”true”. Autoscroll war aus irgendeinem Grund zu spät, es wurde nach oben gescrollt, nachdem die neue Ansicht bereits sichtbar war.
– Gregory Bolkenstijn
10. Juni 2015 um 11:44 Uhr
Das hat bei mir am besten funktioniert: $rootScope.$on(‘$stateChangeSuccess’,function(){ $(“html, body”).animate({ scrollTop: 0 }, 200); });
– Jakob Gentes
25. August 2015 um 15:19 Uhr
$window.scrollTop sollte $window.scrollTo sein, sonst sagt es, dass es nicht existiert. Diese Lösung funktioniert super!
– Software-Propheten
12. August 2016 um 11:40 Uhr
@JamesGentes ich brauchte dieses auch. Vielen Dank.
– Mackenzie Browne
26. November 2017 um 2:47 Uhr
Rizwan Jamal
Dieser Code hat bei mir hervorragend funktioniert. Ich hoffe, er funktioniert auch bei Ihnen. Alles, was Sie tun müssen, ist, einfach $anchorScroll in Ihren Run-Block einzufügen und die Listener-Funktion auf den RootScope anzuwenden, wie ich es im folgenden Beispiel getan habe.
Hier ist die Aufrufreihenfolge des Angularjs-Moduls:
app.config()
app.run()
directive's compile functions (if they are found in the dom)
app.controller()
directive's link functions (again, if found)
LAUFBLOCK werden ausgeführt, nachdem der Injektor erstellt wurde, und werden verwendet, um die Anwendung zu starten
$anchorScroll()
und Sie können jetzt sehen, dass der Bildlauf mit der neuen gerouteten Ansicht nach oben beginnt 🙂
Endlich eine Lösung, die mit Sticky-Headern funktioniert! Vielen Dank!
– Fabio
19. Mai 2017 um 19:06 Uhr
wkonkel
Nach ein oder zwei Stunden des Ausprobierens jeder Kombination von ui-view autoscroll=true, $stateChangeStart, $locationChangeStart, $uiViewScrollProvider.useAnchorScroll(), $provide('$uiViewScroll', ...)und viele andere konnte ich Scroll-to-top-on-new-page nicht wie erwartet zum Laufen bringen.
Das war letztendlich das, was für mich funktioniert hat. Es erfasst pushState und replaceState und aktualisiert die Bildlaufposition nur, wenn zu neuen Seiten navigiert wird (Zurück-/Vorwärts-Schaltflächen behalten ihre Bildlaufpositionen bei):
.run(function($anchorScroll, $window) {
// hack to scroll to top when navigating to new URLS but not back/forward
var wrap = function(method) {
var orig = $window.window.history[method];
$window.window.history[method] = function() {
var retval = orig.apply(this, Array.prototype.slice.call(arguments));
$anchorScroll();
return retval;
};
};
wrap('pushState');
wrap('replaceState');
})
Hier ist meine (scheinbar) robuste, vollständige und (ziemlich) prägnante Lösung. Es verwendet den minifikationskompatiblen Stil (und den Zugriff angle.module(NAME) auf Ihr Modul).
PS Ich habe festgestellt, dass das Autoscroll-Ding keine Auswirkung hatte, ob auf true oder false gesetzt.
Hmmm.. dies scrollt die Ansicht nach oben Erste und dann ändert sich die Ansicht auf dem Bildschirm für mich.
– Strelok
2. Februar 2015 um 23:47 Uhr
Saubere Lösung, nach der ich gesucht habe. Wenn Sie auf “Zurück” klicken, gelangen Sie dorthin, wo Sie aufgehört haben – dies mag für manche nicht wünschenswert sein, aber ich mag es in meinem Fall.
– mjoyce91
23. August 2016 um 20:18 Uhr
Mit dem UI-Router von anglejs mache ich Folgendes:
var scrollContent = function() {
// Your favorite scroll method here
};
Es schlägt auf keiner Seite fehl und ist nicht global.
Hmmm.. dies scrollt die Ansicht nach oben Erste und dann ändert sich die Ansicht auf dem Bildschirm für mich.
– Strelok
2. Februar 2015 um 23:47 Uhr
Saubere Lösung, nach der ich gesucht habe. Wenn Sie auf “Zurück” klicken, gelangen Sie dorthin, wo Sie aufgehört haben – dies mag für manche nicht wünschenswert sein, aber ich mag es in meinem Fall.
– mjoyce91
23. August 2016 um 20:18 Uhr
Gemeinschaft
FYI für alle, die auf das im Titel beschriebene Problem stoßen (so wie ich), der auch die verwendet AngularUI-Router Plugin…
Wie in dieser SO-Frage gestellt und beantwortet, springt der Angular-UI-Router zum Ende der Seite, wenn Sie die Route ändern.
Können Sie nicht herausfinden, warum die Seite unten geladen wird? Angular UI-Router Autoscroll-Problem
Wie in der Antwort angegeben, können Sie dieses Verhalten jedoch ausschalten, indem Sie sagen autoscroll="false" auf Ihrem ui-view.
Meins springt nicht nach unten, es behält nur die Bildlaufposition bei, anstatt nach oben zu gehen.
– Stefan Smith
6. April 2014 um 0:58 Uhr
Dies beantwortet die Frage nicht. Ich habe das gleiche Problem – wenn sich die Route ändert, bleibt die Scrollebene einfach an derselben Stelle, anstatt nach oben zu scrollen. Ich kann es dazu bringen, nach oben zu scrollen, aber nur, indem ich den Hash ändere, was ich aus offensichtlichen Gründen nicht tun möchte.
– Werden
5. Juni 2014 um 1:53 Uhr
13111900cookie-checkDas Ändern der Route scrollt auf der neuen Seite nicht nach obenyes