Il existe quelques solutions, assurez-vous de toutes les vérifier :)
La sortie du routeur émettra l' activate
événement à chaque fois qu'un nouveau composant est instancié, nous pourrions donc utiliser (activate)
pour faire défiler (par exemple) vers le haut:
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)
...
}
Utilisez, par exemple, cette solution pour un défilement fluide:
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);
}
Si vous souhaitez être sélectif, disons que tous les composants ne doivent pas déclencher le défilement, vous pouvez le vérifier dans une if
instruction comme celle-ci:
onActivate(e) {
if (e.constructor.name)==="login"{ // for example
window.scroll(0,0);
}
}
Depuis Angular6.1, nous pouvons également utiliser { scrollPositionRestoration: 'enabled' }
sur des modules chargés avec impatience et il sera appliqué à toutes les routes:
RouterModule.forRoot(appRoutes, { scrollPositionRestoration: 'enabled' })
Il fera également déjà le défilement fluide. Cependant, cela présente l'inconvénient de le faire sur chaque routage.
Une autre solution consiste à faire le défilement supérieur sur l'animation du routeur. Ajoutez ceci dans chaque transition où vous souhaitez faire défiler vers le haut:
query(':enter, :leave', style({ position: 'fixed' }), { optional: true })