Ich verwende Angular 5. Ich habe ein Dashboard, in dem ich nur wenige Abschnitte mit kleinem Inhalt und wenige Abschnitte mit so großem Inhalt habe, dass ich beim Wechseln des Routers nach oben auf ein Problem stoße. Jedes Mal muss ich scrollen, um nach oben zu gelangen. Kann mir jemand helfen, dieses Problem zu lösen, damit meine Ansicht beim Wechseln des Routers immer oben bleibt.
Danke im Voraus.
Antworten:
Es gibt einige Lösungen, stellen Sie sicher, dass Sie alle überprüfen :)
Der Router-Ausgang gibt das
activate
Ereignis jedes Mal aus, wenn eine neue Komponente instanziiert wird, sodass wir(activate)
(zum Beispiel) nach oben scrollen können:app.component.html
app.component.ts
oder verwenden Sie diese Antwort , um das Scrollen zu glätten
Wenn Sie selektiv sein möchten, sagen Sie, dass nicht jede Komponente das Scrollen auslösen soll. Sie können dies überprüfen:
Seit Angular6.1 können wir es auch
{ scrollPositionRestoration: 'enabled' }
auf eifrig geladenen Modulen verwenden und es wird auf alle Routen angewendet:Es wird auch das reibungslose Scrollen ausführen. Dies ist jedoch für jedes Routing unpraktisch.
Eine andere Lösung besteht darin, die Router-Animation nach oben zu scrollen. Fügen Sie dies in jedem Übergang hinzu, in dem Sie nach oben scrollen möchten:
quelle
window
Objekt funktionieren nicht in Winkel 5. Irgendwelche Vermutungen warum?Wenn dieses Problem in Angular 6
scrollPositionRestoration: 'enabled'
auftritt , können Sie es beheben, indem Sie den Parameter zu RouterModule von app-routing.module.ts hinzufügen:quelle
scrollPositionRestoration
Eigenschaft ab dem 6. November 2019 mit Angular 8 zumindest nicht mit dynamischem Seiteninhalt funktioniert (dh wenn der Seiteninhalt asynchron geladen wird): Weitere Informationen findenBEARBEITEN: Für Angular 6+ verwenden Sie bitte die Antwort von Nimesh Nishara Indimagedara und erwähnen Sie:
Ursprüngliche Antwort:
Wenn alles fehlschlägt, erstellen Sie oben ein leeres HTML-Element (z. B. div) (oder einen gewünschten Bildlauf zum Speicherort) mit der ID = "top" in der Vorlage (oder der übergeordneten Vorlage):
Und in Komponente:
quelle
Jetzt ist in Angular 6.1 eine integrierte Lösung mit verfügbar
scrollPositionRestoration
Option .Siehe meine Antwort zu Angular 2. Scrollen Sie bei Routenänderung nach oben .
quelle
Obwohl @Vega die direkte Antwort auf Ihre Frage bietet, gibt es Probleme. Dadurch wird die Vor- / Zurück-Schaltfläche des Browsers unterbrochen. Wenn Ihr Benutzer auf die Schaltfläche "Zurück" oder "Vorwärts" des Browsers klickt, verliert er seinen Platz und wird ganz oben gescrollt. Dies kann für Ihre Benutzer etwas schmerzhaft sein, wenn sie nach unten scrollen mussten, um zu einem Link zu gelangen, und sich entschieden haben, nur zurück zu klicken, um festzustellen, dass die Bildlaufleiste nach oben zurückgesetzt wurde.
Hier ist meine Lösung für das Problem.
quelle
In meinem Fall habe ich gerade hinzugefügt
in
ngOnInit()
und es funktioniert gut.quelle
Ab Angular Version 6+ Keine Verwendung von window.scroll (0,0)
Für Angular-Version
6+
von @ Stellt Optionen zum Konfigurieren des Routers dar.docs
Man kann
scrollPositionRestoration?: 'disabled' | 'enabled' | 'top'
in verwendenBeispiel:
Und wenn man das Scrollen manuell steuern muss, wurde kein
window.scroll(0,0)
gemeinsames Paket von Angular V6 eingeführtViewPortScoller
.Die Verwendung ist ziemlich einfach. Beispiel:
quelle
Wenn Sie mat-sidenav verwenden, geben Sie dem Router-Ausgang eine ID (wenn Sie einen übergeordneten und einen untergeordneten Router-Ausgang haben), verwenden Sie die Aktivierungsfunktion
<router-outlet id="main-content" (activate)="onActivate($event)">
und verwenden Sie diese Abfrageauswahl "mat-sidenav-content", um nach oben zu scrollenonActivate(event) { document.querySelector("mat-sidenav-content").scrollTo(0, 0); }
quelle
id
(ich habe eine Singlerouter-outlet
in meiner App). Ich habe es auch auf einem "eckigeren Weg" gemacht:@ViewChild(MatSidenavContainer) sidenavContainer: MatSidenavContainer; onActivate() { this.sidenavContainer.scrollable.scrollTo({ left: 0, top: 0 }); }
Ich bin immer auf der Suche nach einer integrierten Lösung für dieses Problem, wie es sie in AngularJS gibt. Aber bis dahin funktioniert diese Lösung für mich. Sie ist einfach und bewahrt die Funktionalität der Zurück-Schaltfläche.
app.component.html
app.component.ts
Antwort von zurfyx Originalbeitrag
quelle
Sie müssen nur eine Funktion erstellen, die die Anpassung des Bildlaufs Ihres Bildschirms enthält
beispielsweise
window.scrollTo (xpos, ypos) -> erwarteter Parameter.
quelle
Hier ist eine Lösung, die nur beim ersten Besuch für JEDE Komponente zum Anfang der Komponente scrollt (falls Sie pro Komponente etwas anderes tun müssen):
In jeder Komponente:
quelle
quelle
Winkel 6.1 und höher:
Sie können Gebrauch in Lösung gebaut in verfügbar Angular 6.1+ mit der Option ,
scrollPositionRestoration: 'enabled'
das gleiche zu erreichen.Winkel 6.0 und früher:
Hinweis: Das erwartete Verhalten besteht darin, dass beim Zurücknavigieren zur Seite ein Bildlauf an derselben Stelle durchgeführt werden sollte, an der Sie auf den Link geklickt haben, aber bei jedem Aufrufen jeder Seite nach oben gescrollt werden sollte.
quelle
einfach hinzufügen
window.scrollTo({ top: 0);
zu ngOnInit ()
quelle
Für jemanden, der nach einer Bildlauffunktion sucht, fügen Sie einfach die Funktion hinzu und rufen Sie bei Bedarf auf
quelle
Versuche dies:
app.component.ts
quelle
Komponente: Abonnieren Sie alle Routing-Ereignisse, anstatt eine Aktion in der Vorlage zu erstellen, und scrollen Sie zu NavigationEnd b / c. Andernfalls wird dies bei fehlerhaften Navigationsgeräten oder blockierten Routen usw. ausgelöst. Dies ist ein sicherer Weg, um festzustellen, ob Eine Route wird erfolgreich navigiert und anschließend gescrollt. Ansonsten nichts tun.
HTML
quelle
Versuche dies
Dieser Code unterstützt Winkel 6 <=
quelle