web-dev-qa-db-fra.com

Comment déterminer l'URL de la page précédente en angulaire?

Supposons que je suis actuellement sur la page qui a l'URL /user/:id. Maintenant, à partir de cette page, je navigue vers la page suivante :id/posts.

Maintenant, y a-t-il un moyen de vérifier l’URL précédente, c’est-à-dire /user/:id.

Ci-dessous sont mes itinéraires

export const routes: Routes = [
  { 
    path: 'user/:id', component: UserProfileComponent
  },
  {  
    path: ':id/posts', component: UserPostsComponet 
  }
];
43
Chandra Shekhar

Vous pouvez vous abonner aux modifications d'itinéraire et stocker l'événement en cours afin de pouvoir l'utiliser au prochain

previousUrl: string;
constructor(router: Router) {
  router.events
  .filter(event => event instanceof NavigationEnd)
  .subscribe(e => {
    console.log('prev:', this.previousUrl);
    this.previousUrl = e.url;
  });
}

Voir aussi Comment détecter un changement de route dans Angular 2?

35
Günter Zöchbauer

Peut-être que toutes les autres réponses sont pour 2.X angulaire.

Maintenant, cela ne fonctionne pas pour 5.X ..__ angulaire. Je travaille avec cela.

avec seulement NavigationEnd, vous ne pouvez pas obtenir l'URL précédente.

car le routeur fonctionne de "NavigationStart", "RoutesRecognized", ..., à "NavigationEnd".

Vous pouvez vérifier avec

    router.events.forEach((event) => {
  console.log(event);
});

Mais vous ne pouvez toujours pas obtenir l'URL précédente, même avec "NavigationStart".

Maintenant, vous devez utiliser deux par deux.

import 'rxjs/add/operator/filter';
import 'rxjs/add/operator/pairwise';

constructor(private router: Router) {
  this.router.events
    .filter(e => e instanceof RoutesRecognized)
    .pairwise()
    .subscribe((event: any[]) => {
      console.log(event[0].urlAfterRedirects);
    });
}

Par paire, vous pouvez voir quelle URL est de et vers.

"RoutesRecognized" est l’étape changeante de l’origine à l’URL cible.

donc filtrez-le et récupérez l’URL précédente.

Enfin et surtout,

ce code a mis le composant parent ou supérieur (ex, app.component.ts)

parce que ce code se déclenche après achèvement du routage.

38
BYUNGJU JIN

Créer un service injectable:

import { Injectable } from '@angular/core';
import { Router, RouterEvent, NavigationEnd } from '@angular/router';

 /** A router wrapper, adding extra functions. */
@Injectable()
export class RouterExtService {

  private previousUrl: string = undefined;
  private currentUrl: string = undefined;

  constructor(private router : Router) {
    this.currentUrl = this.router.url;
    router.events.subscribe(event => {
      if (event instanceof NavigationEnd) {        
        this.previousUrl = this.currentUrl;
        this.currentUrl = event.url;
      };
    });
  }

  public getPreviousUrl(){
    return this.previousUrl;
  }    
}

Ensuite, utilisez-le partout où vous avez besoin. Pour stocker la variable actuelle le plus rapidement possible, vous devez utiliser le service dans le module d'application.

// AppModule
export class AppModule {
  constructor(private routerExtService: RouterExtService){}

  //...

}

// Using in SomeComponent
export class SomeComponent implements OnInit {

  constructor(private routerExtService: RouterExtService, private location: Location) { } 

  public back(): void {
    this.location.back();
  }

  //Strange name, but it makes sense. Behind the scenes, we are pushing to history the previous url
  public goToPrevious(): void {
    let previous = this.routerExtService.getPreviousUrl();

    if(previous)
      this.routerExtService.router.navigateByUrl(previous);
  }

  //...

}
15
Juliano

Angular 6 code mis à jour pour obtenir l'URL précédente sous forme de chaîne.

import { Router, RoutesRecognized } from '@angular/router';
import { filter, pairwise } from 'rxjs/operators';


export class AppComponent implements OnInit {

    constructor (
        public router: Router
    ) {
    }

    ngOnInit() {
        this.router.events
            .pipe(filter((e: any) => e instanceof RoutesRecognized),
                pairwise()
            ).subscribe((e: any) => {
                console.log(e[0].urlAfterRedirects); // previous url
            });
    }
7
Franklin Pious

Cela a fonctionné pour moi en angulaire 6: 

this.router.events
            .subscribe((event) => {
              if (event instanceof NavigationStart) {
                window.localStorage.setItem('previousUrl', this.router.url);
              }
            });
2
Praveen Pandey

@ GünterZöchbauer vous pouvez également l'enregistrer dans le stockage local mais je ne le préfère pas).

 constructor(
        private router: Router
      ) {
        this.router.events
          .subscribe((event) => {
            if (event instanceof NavigationEnd) {
              localStorage.setItem('previousUrl', event.url);
            }
          });
      }
1
vladymy