Talvez todas as outras respostas sejam para angular 2.X.
Agora não funciona para o angular 5.X. Estou trabalhando nisso.
com apenas NavigationEnd, você não pode obter url anterior.
porque o roteador funciona de "NavigationStart", "RoutesRecognized", ..., para "NavigationEnd".
Você pode verificar com
router.events.forEach((event) => {
console.log(event);
});
Mas ainda assim você não pode obter url anterior, mesmo com "NavigationStart".
Agora você precisa usar os pares.
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);
});
}
Com o emparelhamento, você pode ver de e para onde é o url.
"RoutesRecognized" é a etapa de mudança da origem para o URL de destino.
então filtre-o e obtenha o URL anterior dele.
Por último mas não menos importante,
coloque este código no componente pai ou superior (por exemplo, app.component.ts)
porque este código dispara após terminar o roteamento.
Atualizar angular 6+
O events.filter
dá erro porque o filtro não faz parte dos eventos, então mude o código para
import { filter, pairwise } from 'rxjs/operators';
this.router.events
.pipe(filter((evt: any) => evt instanceof RoutesRecognized), pairwise())
.subscribe((events: RoutesRecognized[]) => {
console.log('previous url', events[0].urlAfterRedirects);
console.log('current url', events[1].urlAfterRedirects);
});