Il existe quelques solutions, assurez-vous de les vérifier toutes :)
La prise du routeur émettra le activate
à chaque fois qu'un nouveau composant est instancié, nous pourrions donc utiliser l'événement (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 en douceur :
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, c'est-à-dire que tous les composants ne doivent pas déclencher le défilement, vous pouvez le vérifier dans un fichier de type if
une déclaration 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 les modules chargés rapidement et elle sera appliquée à toutes les routes :
RouterModule.forRoot(appRoutes, { scrollPositionRestoration: 'enabled' })
Il fera également le défilement lisse, déjà. Cependant, cela présente l'inconvénient de le faire sur chaque itinéraire.
Une autre solution est de faire le défilement du haut sur une animation de routeur. Ajoutez ceci dans chaque transition où vous voulez faire défiler le haut :
query(':enter, :leave', style({ position: 'fixed' }), { optional: true })
1 votes
Duplicata possible de Angular 2 Défilement vers le haut en cas de changement de route