Có một số giải pháp, hãy đảm bảo kiểm tra tất cả :)
Đầu ra bộ định tuyến sẽ phát ra activate
sự kiện bất kỳ khi nào một thành phần mới đang được khởi tạo, vì vậy chúng tôi có thể sử dụng (activate)
để cuộn (ví dụ) lên đầu:
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)
...
}
hoặc sử dụng câu trả lời này để cuộn mượt mà
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);
}
Nếu bạn muốn chọn lọc, nói rằng không phải mọi thành phần đều nên kích hoạt cuộn, bạn có thể kiểm tra nó:
onActivate(e) {
if (e.constructor.name)==="login"{ // for example
window.scroll(0,0);
}
}
Kể từ Angular6.1, chúng tôi cũng có thể sử dụng
{ scrollPositionRestoration: 'enabled' }
trên các mô-đun được tải nhanh và nó sẽ được áp dụng cho tất cả các tuyến:
RouterModule.forRoot(appRoutes, { scrollPositionRestoration: 'enabled' })
Nó cũng sẽ thực hiện thao tác cuộn mượt mà. Tuy nhiên, điều này có sự bất tiện khi thực hiện nó trên mọi định tuyến.
Một giải pháp khác là thực hiện thao tác cuộn trên cùng trên hoạt ảnh của bộ định tuyến. Thêm điều này vào mọi chuyển đổi mà bạn muốn cuộn lên đầu:
query(':enter, :leave', style({ position: 'fixed' }), { optional: true }),