J'utilise angular 5. J'ai un tableau de bord où j'ai quelques sections avec un petit contenu et quelques sections avec un contenu si grand que je suis confronté à un problème lors du changement de routeur en allant en haut. Chaque fois que j'ai besoin de faire défiler pour aller en haut. Quelqu'un peut-il m'aider à résoudre ce problème afin que lorsque je change de routeur, ma vue reste toujours au sommet.
Merci d'avance.
Réponses:
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
app.component.ts
Utilisez, par exemple, cette solution pour un défilement fluide:
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:Depuis Angular6.1, nous pouvons également utiliser
{ scrollPositionRestoration: 'enabled' }
sur des modules chargés avec impatience et il sera appliqué à toutes les routes: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:
la source
window
objet ne fonctionnent pas en angulaire 5. Des suppositions pourquoi?Si vous rencontrez ce problème dans Angular 6, vous pouvez le résoudre en ajoutant le paramètre
scrollPositionRestoration: 'enabled'
au RouterModule de app-routing.module.ts:la source
scrollPositionRestoration
propriété ne fonctionne pas avec le contenu de page dynamique (c'est-à-dire lorsque le contenu de la page est chargé de manière asynchrone): voir ce rapport de bogue Angular: github.com/angular/angular / issues / 24547EDIT: Pour Angular 6+, veuillez utiliser la réponse de Nimesh Nishara Indimagedara en mentionnant:
Réponse originale:
Si tout échoue, créez un élément HTML vide (par exemple: div) en haut (ou faites défiler jusqu'à l'emplacement souhaité) avec id = "top" sur le modèle (ou le modèle parent):
Et en composant:
la source
Il existe maintenant une solution intégrée disponible dans Angular 6.1 avec
scrollPositionRestoration
option.Voir ma réponse sur Angular 2 Faites défiler vers le haut sur Route Change .
la source
Bien que @Vega fournisse la réponse directe à votre question, il y a des problèmes. Il casse le bouton Précédent / Suivant du navigateur. Si votre utilisateur clique sur le bouton Précédent ou Suivant du navigateur, il perd sa place et se fait défiler en haut. Cela peut être un peu pénible pour vos utilisateurs s'ils devaient faire défiler vers le bas pour accéder à un lien et décidaient de cliquer en arrière uniquement pour trouver que la barre de défilement avait été réinitialisée en haut.
Voici ma solution au problème.
la source
Dans mon cas, je viens d'ajouter
dans
ngOnInit()
et son fonctionnement très bien.la source
À partir de Angular Version 6+ Pas besoin d'utiliser window.scroll (0,0)
Pour la version angulaire
6+
de @ Représente les options de configuration du routeur.docs
On peut utiliser
scrollPositionRestoration?: 'disabled' | 'enabled' | 'top'
dansExemple:
Et si l'on a besoin de contrôler manuellement le défilement, pas besoin d'utiliser à la
window.scroll(0,0)
place du package commun Angular V6ViewPortScoller
.L'utilisation est assez simple Exemple:
la source
si vous utilisez mat-sidenav, donnez un identifiant à la sortie du routeur (si vous avez des sorties de routeur parent et enfant) et utilisez la fonction activate
<router-outlet id="main-content" (activate)="onActivate($event)">
et utilisez ce sélecteur de requête `` mat-sidenav-content '' pour faire défiler vers le hautonActivate(event) { document.querySelector("mat-sidenav-content").scrollTo(0, 0); }
la source
id
(j'en ai unrouter-outlet
sur mon application). Je l'ai aussi fait d'une manière plus `` angulaire '':@ViewChild(MatSidenavContainer) sidenavContainer: MatSidenavContainer; onActivate() { this.sidenavContainer.scrollable.scrollTo({ left: 0, top: 0 }); }
Je continue de chercher une solution intégrée à ce problème, comme dans AngularJS. Mais jusque-là, cette solution fonctionne pour moi, c'est simple et préserve la fonctionnalité du bouton de retour.
app.component.html
app.component.ts
Réponse de zurfyx original post
la source
Il vous suffit de créer une fonction qui contient le réglage du défilement de votre écran
par exemple
window.scrollTo (xpos, ypos) -> paramètre attendu.
la source
Voici une solution qui ne défile vers le haut du composant que lors de la première visite pour CHAQUE composant (au cas où vous auriez besoin de faire quelque chose de différent par composant):
Dans chaque composant:
la source
la source
Angular 6.1 et versions ultérieures:
Vous pouvez utiliser la solution intégrée disponible dans Angular 6.1+ avec option
scrollPositionRestoration: 'enabled'
pour obtenir la même chose.Angular 6.0 et versions antérieures:
Remarque: le comportement attendu est que lorsque vous revenez à la page, elle doit rester défilée vers le bas jusqu'au même emplacement que lorsque vous avez cliqué sur le lien, mais défiler vers le haut lorsque vous arrivez sur chaque page.
la source
il suffit d'ajouter
window.scrollTo({ top: 0);
à ngOnInit ()
la source
Pour quelqu'un qui recherche une fonction de défilement, ajoutez simplement la fonction et appelez-la quand vous en avez besoin
la source
Essaye ça:
app.component.ts
la source
Composant: Abonnez-vous à tous les événements de routage au lieu de créer une action dans le modèle et faites défiler NavigationEnd b / c, sinon vous le déclencherez sur de mauvaises navigations ou des routes bloquées, etc. C'est un moyen sûr de savoir que si une route est parcourue avec succès, puis faites défiler. Sinon, ne faites rien.
HTML
la source
essaye ça
ce code pris en charge angulaire 6 <=
la source