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
}
];
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?
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.
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);
}
//...
}
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
});
}
Cela a fonctionné pour moi en angulaire 6:
this.router.events
.subscribe((event) => {
if (event instanceof NavigationStart) {
window.localStorage.setItem('previousUrl', this.router.url);
}
});
@ 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);
}
});
}