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
<router-outlet (activate)="onActivate($event)" ></router-outlet>
app.component.ts
onActivate(event) {
window.scroll(0,0);
//or document.body.scrollTop = 0;
//or document.querySelector('body').scrollTo(0,0)
...
}
oder verwenden Sie diese Antwort , um das Scrollen zu glätten
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 Sie, dass nicht jede Komponente das Scrollen auslösen soll. Sie können dies überprüfen:
onActivate(e) {
if (e.constructor.name)==="login"{ // for example
window.scroll(0,0);
}
}
Seit Angular6.1 können wir es auch
{ scrollPositionRestoration: 'enabled' }
auf eifrig geladenen Modulen verwenden und es wird auf alle Routen angewendet:
RouterModule.forRoot(appRoutes, { scrollPositionRestoration: 'enabled' })
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:
query(':enter, :leave', style({ position: 'fixed' }), { optional: true }),