Есть несколько решений, обязательно проверьте их все :)
Выход маршрутизатора будет генерировать activate
событие каждый раз, когда создается новый компонент, поэтому мы могли бы использовать (activate)
для прокрутки (например) вверх:
app.component.html
<router-outlet (activate)="onActivate($event)" ></router-outlet>
app.component.ts
onActivate(event) {
window.scroll(0,0);
...
}
Используйте, например, это решение для плавной прокрутки:
onActivate(event) {
let scrollToTop = window.setInterval(() => {
let pos = window.pageYOffset;
if (pos > 0) {
window.scrollTo(0, pos - 20);
} else {
window.clearInterval(scrollToTop);
}
}, 16);
}
Если вы хотите быть избирательным, скажем, не каждый компонент должен запускать прокрутку, вы можете проверить это с помощью такого if
оператора:
onActivate(e) {
if (e.constructor.name)==="login"{
window.scroll(0,0);
}
}
Начиная с Angular6.1, мы также можем использовать { scrollPositionRestoration: 'enabled' }
для загруженных модулей, и это будет применяться ко всем маршрутам:
RouterModule.forRoot(appRoutes, { scrollPositionRestoration: 'enabled' })
Он также будет выполнять плавную прокрутку. Однако это неудобно делать на любой маршрутизации.
Другое решение - сделать верхнюю прокрутку анимации маршрутизатора. Добавьте это в каждый переход, где вы хотите прокрутить вверх:
query(':enter, :leave', style({ position: 'fixed' }), { optional: true })