Є кілька рішень, обов’язково перевірте їх усі :)
Розетка маршрутизатора видаватиме activate
подію щоразу, коли створюється інстанція нового компонента, тому ми могли б скористатися (activate)
для прокрутки (наприклад) до початку:
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)
...
}
Для прикладу використовуйте це рішення для плавного прокручування:
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);
}
Якщо ви хочете бути вибірковим, скажімо, не кожен компонент повинен запускати прокрутку, ви можете перевірити це в такому if
твердженні:
onActivate(e) {
if (e.constructor.name)==="login"{ // for example
window.scroll(0,0);
}
}
Починаючи з Angular6.1, ми також можемо використовувати { scrollPositionRestoration: 'enabled' }
модулі, що завантажуються, і це буде застосовано до всіх маршрутів:
RouterModule.forRoot(appRoutes, { scrollPositionRestoration: 'enabled' })
Він також вже виконуватиме плавну прокрутку. Однак це незручно робити це на кожному маршруті.
Іншим рішенням є прокрутка зверху на анімації маршрутизатора. Додайте це в кожному переході, де ви хочете прокрутити угору:
query(':enter, :leave', style({ position: 'fixed' }), { optional: true })