Ada beberapa solusi, pastikan untuk memeriksa semuanya :)
Outlet router akan memancarkan activate
acara setiap kali komponen baru dibuat, jadi kita dapat menggunakan (activate)
untuk menggulir (misalnya) ke atas:
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)
...
}
Gunakan, misalnya, solusi ini untuk pengguliran yang mulus:
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);
}
Jika Anda ingin selektif, katakanlah tidak setiap komponen harus memicu scrolling, Anda dapat memeriksanya dalam if
pernyataan seperti ini:
onActivate(e) {
if (e.constructor.name)==="login"{ // for example
window.scroll(0,0);
}
}
Sejak Angular6.1, kita juga dapat menggunakan { scrollPositionRestoration: 'enabled' }
modul yang dimuat dengan penuh semangat dan ini akan diterapkan ke semua rute:
RouterModule.forRoot(appRoutes, { scrollPositionRestoration: 'enabled' })
Ini juga akan melakukan pengguliran halus. Namun hal ini menimbulkan ketidaknyamanan untuk melakukannya di setiap perutean.
Solusi lain adalah melakukan scrolling atas pada animasi router. Tambahkan ini di setiap transisi di mana Anda ingin menggulir ke atas:
query(':enter, :leave', style({ position: 'fixed' }), { optional: true })