Angular 5 Bei jedem Klick auf die Route nach oben scrollen

Lesezeit: 6 Minuten

Angular 5 Bei jedem Klick auf die Route nach oben
raihan

Ich verwende Angular 5. Ich habe ein Dashboard mit wenigen Abschnitten mit kleinem Inhalt und wenigen Abschnitten mit so großem Inhalt, dass ich beim Wechseln des Routers nach oben auf ein Problem stoße. Jedes Mal muss ich scrollen, um nach oben zu gelangen.

Wie kann ich dieses Problem lösen, damit beim Wechseln des Routers meine Ansicht immer oben bleibt?

  • Mögliches Duplikat von Angular 2 Bei Routenänderung nach oben scrollen

    – Zerbrus

    29. Mai ’19 um 9:43

Angular 5 Bei jedem Klick auf die Route nach oben
Vega

Es gibt einige Lösungen, überprüfen Sie sie alle 🙂


Die Router-Steckdose gibt die activate Ereignis jedes Mal, wenn eine neue Komponente instanziiert wird, also könnten wir verwenden (activate) um (zum Beispiel) nach oben zu scrollen:

app.component.html

<router-outlet (activate)="onActivate($event)" ></router-outlet>

app.komponente.ts

onActivate(event) {
    window.scroll(0,0);
    //or document.body.scrollTop = 0;
    //or document.querySelector('body').scrollTo(0,0)
    ...
}

Verwenden Sie zum Beispiel diese Lösung für ein reibungsloses Scrollen:

    onActivate(event) {
        let scrollToTop = window.setInterval(() => {
            let pos = window.pageYOffset;
            if (pos > 0) {
                window.scrollTo(0, pos - 20); // how far to scroll on each step
            } else {
                window.clearInterval(scrollToTop);
            }
        }, 16);
    }

Wenn Sie selektiv sein möchten, sagen wir, dass nicht jede Komponente das Scrollen auslösen soll, können Sie dies in einem überprüfen if Aussage wie diese:

onActivate(e) {
    if (e.constructor.name)==="login"{ // for example
            window.scroll(0,0);
    }
}

Seit Angular6.1 können wir auch { scrollPositionRestoration: 'enabled' } auf eifrig geladenen Modulen und wird auf alle Routen angewendet:

RouterModule.forRoot(appRoutes, { scrollPositionRestoration: 'enabled' })

Es wird auch bereits das reibungslose Scrollen übernehmen. Dies hat jedoch den Nachteil, dies bei jedem Routing zu tun.


Eine andere Lösung besteht darin, die Router-Animation nach oben zu scrollen. Fügen Sie dies in jedem Übergang hinzu, bei dem Sie nach oben scrollen möchten:

query(':enter, :leave', style({ position: 'fixed' }), { optional: true }) 

  • blättere Ereignisse auf window Objekt funktionieren nicht in Winkel 5. Irgendwelche Vermutungen warum?

    – Sahil Babbar

    21. Mai ’18 um 4:54

  • @SahilBabbar, Überprüfen Sie das Body-CSS, overflow:hiden ? wie hoch ist sie?

    – Vega

    21. Mai ’18 um 7:53

  • @Vega-Nr. Die Höhe des Körpers ist voreingestellt und im Inneren ist nichts fest codiert, da es sich um eine normale Angular 5-Anwendung handelt. Schauen Sie sich außerdem die Angular-Dokumente an, in denen das steht scroll Ereignisse werden von ngzones auf die schwarze Liste gesetzt.

    – Sahil Babbar

    21. Mai ’18 um 9:24

  • Versuchen Sie document.body.scrollTop = 0; oder mit altem js document.querySelector(‘body’).scrollTo(0,0), etc.. Wenn diese nicht funktionieren, geben Sie ein MCVE an

    – Vega

    21. Mai ’18 um 11:56

  • Gibt es eine Möglichkeit für das Lazyloaded-Modul?

    – Pankaj Prakash

    2. Juni ’19 um 17:12

Angular 5 Bei jedem Klick auf die Route nach oben
Nimezzz

Wenn dieses Problem in Angular 6 auftritt, können Sie es beheben, indem Sie den Parameter hinzufügen scrollPositionRestoration: 'enabled' zum RouterModule von app-routing.module.ts:

@NgModule({
  imports: [RouterModule.forRoot(routes,{
    scrollPositionRestoration: 'enabled'
  })],
  exports: [RouterModule]
})

  • Beachten Sie, dass ab dem 6. November 2019 mit Angular 8 zumindest die scrollPositionRestoration -Eigenschaft funktioniert nicht mit dynamischem Seiteninhalt (dh wenn der Seiteninhalt asynchron geladen wird): siehe diesen Angular-Fehlerbericht: github.com/angular/angular/issues/24547

    – dbachy1

    6. November ’19 um 20:47


1641740680 569 Angular 5 Bei jedem Klick auf die Route nach oben
GeoRover

BEARBEITEN: Für Angular 6+ verwenden Sie bitte die Antwort von Nimesh Nishara Indimagedara mit der Erwähnung:

RouterModule.forRoot(routes, {
    scrollPositionRestoration: 'enabled'
});

Ursprüngliche Antwort:

Wenn alles fehlschlägt, erstellen Sie oben ein leeres HTML-Element (zB: div) (oder scrollen Sie zum gewünschten Ort) mit id=”top” auf der Vorlage (oder der übergeordneten Vorlage):

<div id="top"></div>

Und im Bestandteil:

  ngAfterViewInit() {
    // Hack: Scrolls to top of Page after page view initialized
    let top = document.getElementById('top');
    if (top !== null) {
      top.scrollIntoView();
      top = null;
    }
  }

  • Diese Lösung hat bei mir funktioniert (sowohl auf Chrome als auch auf Edge getestet). Die akzeptierte Lösung hat für mein Projekt nicht funktioniert (Angular5)

    – Rob van Meeuwen

    7. Mai ’18 um 15:20

  • @RobvanMeeuwen, Wenn meine Antwort nicht funktioniert hat, haben Sie sie wahrscheinlich nicht auf die gleiche Weise implementiert. Diese Lösung manipuliert direkt das DOM, was auch nicht richtig ist

    – Vega

    22. Januar ’19 bei 6:54


  • @Vega, deshalb habe ich es einen Hack genannt. Ihre Lösung ist die richtige. Einige Leute hier konnten Ihren nicht implementieren, also habe ich den Fallback-Hack angeboten. Sie sollten ihren Code basierend auf der Version umgestalten, auf der sie sich zu diesem Zeitpunkt befinden.

    – GeoRover

    23. Januar ’19 um 21:51

  • Von all dieser Lösung ist Arbeit für mich. Danke @GeoRover

    – Gangani Roshan

    17. Mai ’19 um 7:05

  • Für Angular 6+ verwenden Sie bitte die Antwort von Nimesh Nishara Indimagedara.

    – GeoRover

    5. Juni ’19 um 21:55

1641740680 261 Angular 5 Bei jedem Klick auf die Route nach oben
Abdul Rafay

Jetzt gibt es eine integrierte Lösung in Angular 6.1 mit scrollPositionRestoration Möglichkeit.

Siehe meine Antwort auf Angular 2 Bei Routenänderung nach oben scrollen.

1641740680 683 Angular 5 Bei jedem Klick auf die Route nach oben
Vikas

Ab Angular Version 6+ Keine Notwendigkeit, window.scroll(0,0) zu verwenden

Für Winkelversion 6+ von @docs

Stellt Optionen zum Konfigurieren des Routers dar.

interface ExtraOptions {
  enableTracing?: boolean
  useHash?: boolean
  initialNavigation?: InitialNavigation
  errorHandler?: ErrorHandler
  preloadingStrategy?: any
  onSameUrlNavigation?: 'reload' | 'ignore'
  scrollPositionRestoration?: 'disabled' | 'enabled' | 'top'
  anchorScrolling?: 'disabled' | 'enabled'
  scrollOffset?: [number, number] | (() => [number, number])
  paramsInheritanceStrategy?: 'emptyOnly' | 'always'
  malformedUriErrorHandler?: (error: URIError, urlSerializer: UrlSerializer, url: string) => UrlTree
  urlUpdateStrategy?: 'deferred' | 'eager'
  relativeLinkResolution?: 'legacy' | 'corrected'
}

Kann man gebrauchen scrollPositionRestoration?: 'disabled' | 'enabled' | 'top' in

Beispiel:

RouterModule.forRoot(routes, {
    scrollPositionRestoration: 'enabled'|'top' 
});

Und wenn man das Scrollen manuell steuern muss, braucht man es nicht zu verwenden window.scroll(0,0)
Stattdessen wurde von Angular V6 ein gemeinsames Paket eingeführt ViewPortScoller.

abstract class ViewportScroller {
  static ngInjectableDef: defineInjectable({ providedIn: 'root', factory: () => new BrowserViewportScroller(inject(DOCUMENT), window) })
  abstract setOffset(offset: [number, number] | (() => [number, number])): void
  abstract getScrollPosition(): [number, number]
  abstract scrollToPosition(position: [number, number]): void
  abstract scrollToAnchor(anchor: string): void
  abstract setHistoryScrollRestoration(scrollRestoration: 'auto' | 'manual'): void
}

Die Verwendung ist ziemlich einfach
Beispiel:

import { Router } from '@angular/router';
import {  ViewportScroller } from '@angular/common'; //import
export class RouteService {

  private applicationInitialRoutes: Routes;
  constructor(
    private router: Router;
    private viewPortScroller: ViewportScroller//inject
  )
  {
   this.router.events.pipe(
            filter(event => event instanceof NavigationEnd))
            .subscribe(() => this.viewPortScroller.scrollToPosition([0, 0]));
}

  • Seltsamerweise funktioniert jede Lösung in einigen Fällen und versagt in anderen. Angulares Scrollen nach oben ist ernsthaft fehlerhaft.

    – Sajib Acharya

    29. Januar ’21 um 21:48

  • Ich konnte ViewportScroller in meine Komponente einfügen. Es erwachte.

    – Codename Jack

    21. Okt ’21 um 8:45

Obwohl @Vega die direkte Antwort auf Ihre Frage bietet, gibt es Probleme. Es bricht die Zurück/Vorwärts-Schaltfläche des Browsers. Wenn Ihr Benutzer auf die Zurück- oder Vorwärts-Schaltfläche des Browsers klickt, verliert er seinen Platz und wird ganz nach oben gescrollt. Dies kann für Ihre Benutzer ein wenig mühsam sein, wenn sie weit nach unten scrollen müssen, um zu einem Link zu gelangen, und sich entscheiden, zurück zu klicken, nur um festzustellen, dass die Bildlaufleiste nach oben zurückgesetzt wurde.

Hier ist meine Lösung für das Problem.

export class AppComponent implements OnInit {
  isPopState = false;

  constructor(private router: Router, private locStrat: LocationStrategy) { }

  ngOnInit(): void {
    this.locStrat.onPopState(() => {
      this.isPopState = true;
    });

    this.router.events.subscribe(event => {
      // Scroll to top if accessing a page, not via browser history stack
      if (event instanceof NavigationEnd && !this.isPopState) {
        window.scrollTo(0, 0);
        this.isPopState = false;
      }

      // Ensures that isPopState is reset
      if (event instanceof NavigationEnd) {
        this.isPopState = false;
      }
    });
  }
}

  • Seltsamerweise funktioniert jede Lösung in einigen Fällen und versagt in anderen. Angulares Scrollen nach oben ist ernsthaft fehlerhaft.

    – Sajib Acharya

    29. Januar ’21 um 21:48

  • Ich konnte ViewportScroller in meine Komponente einfügen. Es erwachte.

    – Codename Jack

    21. Okt ’21 um 8:45

1641740680 443 Angular 5 Bei jedem Klick auf die Route nach oben
Zohab Ali

In meinem Fall habe ich gerade hinzugefügt

window.scroll(0,0);

in ngOnInit() und es funktioniert gut.

.

219870cookie-checkAngular 5 Bei jedem Klick auf die Route nach oben scrollen

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

Privacy policy