Как определить предыдущий URL страницы в Angular?

Предположим, что я нахожусь на странице с URL /user/:id. Теперь с этой страницы перейдите на следующую страницу :id/posts.

Теперь есть способ, чтобы я мог проверить, что такое предыдущий URL, т.е. /user/:id.

Ниже приведены мои маршруты

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

Ответы

Ответ 1

Вы можете подписаться на изменения маршрута и сохранить текущее событие, чтобы вы могли использовать его, когда произойдет следующее.

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

См. также Как определить изменение маршрута в Angular 2?

Ответ 2

Возможно, все остальные ответы для angular 2.X.

Теперь это не работает для angular 5.X. Im работает с ним.

с помощью только NavigationEnd, вы не сможете получить предыдущий url.

потому что Router работает с "NavigationStart", "RoutesRecognized",..., "NavigationEnd".

Вы можете проверить с помощью

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

Но вы не можете получить предыдущий url даже с помощью "NavigationStart".

Теперь вам нужно использовать попарно.

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);
    });
}

С попарно, вы можете видеть, с какого URL-адреса и с.

"RoutesRecognized" - это шаг перехода от исходного к целевому URL.

поэтому отфильтруйте его и получите от него предыдущий url.

И последнее, но не менее важное:

этот код помещает родительский компонент или выше (например, app.component.ts)

потому что этот код запускается после финишной маршрутизации.

Ответ 3

@GünterZöchbauer также вы можете сохранить его в localstorage, но я не предпочитаю его) лучше сохранить в обслуживании и получить это значение оттуда

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

Ответ 4

Ввести Router и подписаться на события и сохранить их для последующей ссылки

constructor(private _router: Router) {
  this._router.subscribe(route => {
    this.nextRoute ...
    this.prevRoute ...
  });