Angulaire 5 faire Défiler vers le haut sur chaque Itinéraire, cliquez

j'utilise l'angle 5. J'ai un tableau de bord où j'ai peu de sections avec un petit contenu et peu de sections avec un contenu si grand que je suis confronté à un problème lors du changement de routeur tout en allant vers le haut. Chaque fois que j'ai besoin de faire défiler pour aller en haut. Est-ce que quelqu'un peut m'aider à résoudre ce problème de sorte que lorsque je change le routeur ma vue reste toujours au sommet.

Merci d'avance.

21
demandé sur rafi 2018-01-01 11:46:48

9 réponses

une sortie de routeur émettra un événement activate chaque fois qu'un nouveau composant est instancié, donc (activate) événement pourrait être de faire défiler (par exemple) vers le haut:

app.composant.html

<router-outlet (activate)="onActivate($event)" ></router-outlet>

app.composant.ts

onActivate(event) {
    window.scroll(0,0);
    //or document.body.scrollTop = 0;
    //or document.querySelector('body').scrollTo(0,0)
    ...
}

ou à l'aide de cette réponse smooth scroll

    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, dites que chaque composant ne devrait pas déclencher le défilement, vous pouvez le vérifier:

onActivate(e) {
    if (e.constructor.name)==="login"{ // for example
            window.scroll(0,0);
    }
}
44
répondu Vega 2018-05-27 13:59:27

si tout échoue, alors créer un élément HTML vide (par exemple: div) en haut (ou défiler vers l'emplacement désiré) avec id= "top" sur le modèle (ou le modèle parent):

<div id="top"></div>

et dans le composant:

  ngAfterViewInit() {
    // Hack: Scrolls to top of Page after page view initialized
    let top = document.getElementById('top');
    if (top !== null) {
      top.scrollIntoView();
      top = null;
    }
  }
6
répondu GeoRover 2018-07-17 20:04:17

bien que @Vega fournisse la réponse directe à votre question, il y a des problèmes. Il casse le bouton back/forward du navigateur. Si vous êtes l'utilisateur clique sur le bouton de retour ou vers l'avant du navigateur, ils perdent leur place et obtient scrolled chemin au sommet. Cela peut être un peu une douleur pour vos utilisateurs s'ils ont dû faire défiler le chemin vers le bas pour obtenir un lien et ont décidé de cliquer en arrière seulement pour trouver le scrollbar avait été réinitialisé au sommet.

Voici ma solution au problème.

export class AppComponent implements OnInit {
  isPopState = false;

  constructor(private router: Router, private locStrat: LocationStrategy) { }

  ngOnInit(): void {
    this.locStrat.onPopState(() => {
      this.isPopState = true;
    });

    this.router.events.subscribe(event => {
      // Scroll to top if accessing a page, not via browser history stack
      if (event instanceof NavigationEnd && !this.isPopState) {
        window.scrollTo(0, 0);
        this.isPopState = false;
      }

      // Ensures that isPopState is reset
      if (event instanceof NavigationEnd) {
        this.isPopState = false;
      }
    });
  }
}
4
répondu Sal_Vader_808 2018-03-12 12:34:18

maintenant il y a une solution intégrée disponible en angle 6.1 avec l'option scrollPositionRestoration .

Voir ma réponse sur Angulaire 2 faire Défiler vers le haut sur la Route du Changement .

3
répondu Abdul Rafay 2018-09-07 09:04:32

Voici une solution qui ne défile au-dessus du composant qu'en cas de première visite pour chaque composant (au cas où vous auriez besoin de faire quelque chose de différent par composant):

dans chaque composant:

export class MyComponent implements OnInit {

firstLoad: boolean = true;

...

ngOnInit() {

  if(this.firstLoad) {
    window.scroll(0,0);
    this.firstLoad = false;
  }
  ...
}
1
répondu user9280655 2018-03-11 17:15:50

je continue à chercher une solution intégrée à ce problème comme il y a à AngularJS. Mais d'ici là, cette solution fonctionne pour moi, c'est simple, et préserve la fonctionnalité de bouton arrière.

app.composant.html

<router-outlet (deactivate)="onDeactivate()"></router-outlet>

app.composant.ts

onDeactivate() {
  document.body.scrollTop = 0;
  // Alternatively, you can scroll to top by using this other call:
  // window.scrollTo(0, 0)
}

Réponse zurfyx post original

1
répondu Jared Whipple 2018-03-19 02:57:36

dans mon cas je viens d'ajouter

window.scroll(0,0);

dans ngOnInit() et son amende de travail.

1
répondu Zohab Ali 2018-07-08 11:52:31

vous avez juste besoin de créer une fonction qui contient le réglage du défilement de votre écran

par exemple

window.scroll(0,0) OR window.scrollTo() by passing appropriate parameter.

de la fenêtre.scrollTo (xpos, ypos) --> paramètre attendu.

1
répondu Vijay Barot 2018-07-08 12:07:36

essayez ceci:

app.composant.ts

import {Component, OnInit, OnDestroy} from '@angular/core';
import {Router, NavigationEnd} from '@angular/router';
import {filter} from 'rxjs/operators';
import {Subscription} from 'rxjs';

@Component({
    selector: 'app-root',
    templateUrl: './app.component.html',
    styleUrls: ['./app.component.scss'],
})
export class AppComponent implements OnInit, OnDestroy {
    subscription: Subscription;

    constructor(private router: Router) {
    }

    ngOnInit() {
        this.subscription = this.router.events.pipe(
            filter(event => event instanceof NavigationEnd)
        ).subscribe(() => window.scrollTo(0, 0));
    }

    ngOnDestroy() {
        this.subscription.unsubscribe();
    }
}
0
répondu Eray T 2018-10-04 18:18:17