Jest kilka rozwiązań, koniecznie sprawdź je wszystkie :)
Gniazdo routera wyemituje activate
zdarzenie za każdym razem, gdy tworzony jest nowy komponent, więc możemy użyć (activate)
do przewijania (na przykład) do góry:
app.component.html
<router-outlet (activate)="onActivate($event)" ></router-outlet>
app.component.ts
onActivate(event) {
window.scroll(0,0);
...
}
Użyj na przykład tego rozwiązania do płynnego przewijania:
onActivate(event) {
let scrollToTop = window.setInterval(() => {
let pos = window.pageYOffset;
if (pos > 0) {
window.scrollTo(0, pos - 20);
} else {
window.clearInterval(scrollToTop);
}
}, 16);
}
Jeśli chcesz być selektywny, powiedz, że nie każdy komponent powinien wywoływać przewijanie, możesz to sprawdzić w if
instrukcji takiej jak ta:
onActivate(e) {
if (e.constructor.name)==="login"{
window.scroll(0,0);
}
}
Od Angular6.1 możemy również używać { scrollPositionRestoration: 'enabled' }
na chętnie ładowanych modułach i będzie to zastosowane do wszystkich tras:
RouterModule.forRoot(appRoutes, { scrollPositionRestoration: 'enabled' })
Będzie również wykonywać płynne przewijanie. Jednak jest to niewygodne przy każdym routingu.
Innym rozwiązaniem jest przewijanie w górę animacji routera. Dodaj to w każdym przejściu, w którym chcesz przewinąć do góry:
query(':enter, :leave', style({ position: 'fixed' }), { optional: true })