Das Ändern der Route scrollt auf der neuen Seite nicht nach oben

Lesezeit: 6 Minuten

Benutzer-Avatar
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


Benutzer-Avatar
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

Benutzer-Avatar
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.

 angular.module('myAngularApp')
.run(function($rootScope, Auth, $state, $anchorScroll){
    $rootScope.$on("$locationChangeSuccess", function(){
        $anchorScroll();
    });

Hier ist die Aufrufreihenfolge des Angularjs-Moduls:

  1. app.config()
  2. app.run()
  3. directive's compile functions (if they are found in the dom)
  4. app.controller()
  5. 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

Benutzer-Avatar
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).

angular.module('yourModuleName').run(["$rootScope", "$anchorScroll" , function ($rootScope, $anchorScroll) {
    $rootScope.$on("$locationChangeSuccess", function() {
                $anchorScroll();
    });
}]);

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:

    .state('myState', {
        url: '/myState',
        templateUrl: 'app/views/myState.html',
        onEnter: scrollContent
    })

Mit:

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

Benutzer-Avatar
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.

Zum Beispiel:

<div ui-view="pagecontent" autoscroll="false"></div>
<div ui-view="sidebar" autoscroll="false"></div> 

http://angular-ui.github.io/ui-router/site/#/api/ui.router.state.directive: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

1311190cookie-checkDas Ändern der Route scrollt auf der neuen Seite nicht nach oben

This website is using cookies to improve the user-friendliness. You agree by using the website further.

Privacy policy