Je développe une application angular2 et j'utilise un routeur . Je suis dans une page/myapp/inscription. après inscription, je navigue dans/myapp/login./myapp/login peut également être parcouru à partir de ma page d'accueil qui est/myapp. Alors maintenant, quand les utilisateurs/myapp/login, je reviens en arrière. Cela peut être fait en utilisant location.back (). Mais je ne veux pas revenir en arrière lorsque l'utilisateur vient de/myapp/signup. Donc, je devrais vérifier si l'utilisateur vient de/myapp/signup et si oui, je veux le diriger vers un autre endroit .. Comment puis-je connaître l'URL précédente afin que je dirige l'utilisateur vers un état spécifique ?
L'opérateur pairwise
permet d'obtenir le courant avec la valeur précédente
mettre à jour
import 'rxjs/add/operator/pairwise';
import 'rxjs/add/operator/filter';
import { Router, NavigationEnd } from '@angular/router';
export class AppComponent {
constructor(private router: Router) {
this.router.events
.filter(e => e instanceof NavigationEnd)
.pairwise().subscribe((e) => {
console.log(e);
});
}
}
Voir aussi Comment détecter un changement de route en angulaire?
original (super vieux)
Injectez Router
et souscrivez à des événements et stockez-les pour référence ultérieure
constructor(private _router: Router) {
this._router.subscribe(route => {
this.nextRoute ...
this.prevRoute ...
});
Oui, je le ferais de cette façon:
@Injectable() // do not forget to register this class as a provider
export class PreviousRouteRecorder implements CanDeactivate<any> {
constructor(private router: Router) {
}
canDeactivate(component: any): Observable<boolean> | boolean {
localStorage.setItem('previousRoute', this.router.url);
return true;
}
}
export const ROUTES: Routes = [
{
path: 'first',
component: FirstComponent,
canDeactivate: [PreviousRouteRecorder]},
{
path: 'second',
component: SecondComponent
}
];
export class SecondComponent implements OnInit {
ngOnInit(){
console.log(localStorage.getItem('previousRoute'));
}
}
Angular 6 code mis à jour pour obtenir l'URL précédente sous forme de chaîne.
import { Component, OnInit } from '@angular/core';
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
});
}
Vous pouvez définir l'URL précédente à l'aide d'un garde d'authentification et définir l'URL précédente dans tous les cas de l'application.
canActivate(route: ActivatedRouteSnapshot, snapshot: RouterStateSnapshot) {
this.commonService.prevRouter = this.router.url;
}
L'implémentation avec la paire ne fonctionnera pas si l'utilisateur ne déclenche pas l'événement de navigation au moins deux fois et risque de causer un petit bogue.
page 1 -> page 2 ---> événement de navigation déclenché, mais l'événement Observable n'a qu'une valeur et donc, par paire, il n'est pas émis ---> L'utilisateur ne peut pas revenir à la page 1
page 2 -> page 3 --> événement Observable a maintenant 2 éléments et émet par paires
Je me demande s'il y a une solution de contournement?
Vous pouvez le faire avec document.referrer
if(document.referrer !== '/myapp/signup'){
location.back()
}
Vous pouvez peut-être utiliser la phase OnActivate
avec la méthode routerOnActivate
qui vous donne accès à l’URL précédente et à l’URL actuelle.
routerOnActivate(next: ComponentInstruction, prev: ComponentInstruction) {
console.log(`Finished navigating from "${prev ? prev.urlPath : 'null'}" to "${next.urlPath}"`);
}