Как вернуться на предыдущую страницу

Есть ли умный способ вернуться на последнюю страницу в Angular 2?

Что-то вроде

this._router.navigate(LASTPAGE);

Например, на странице C есть кнопка Go Back,

  • Страница A → Страница C, щелкните ее, чтобы вернуться на страницу A.

  • Страница B → Страница C, щелкните ее, чтобы вернуться на страницу B.

У роутера есть эта информация истории?

Ответ 1

На самом деле вы можете воспользоваться встроенной службой определения местоположения, которая владеет API "Back".

Здесь (в TypeScript):

import {Component} from '@angular/core';
import {Location} from '@angular/common';

@Component({
  // component declarations here
})
class SomeComponent {

  constructor(private _location: Location) 
  {}

  backClicked() {
    this._location.back();
  }
}

Ответ 2

В финальной версии Angular 2.x/4.x - здесь документы https://angular.io/api/common/Location

/* typescript */

import { Location } from '@angular/common';
// import stuff here

@Component({
// declare component here
})
export class MyComponent {

  // inject location into component constructor
  constructor(private location: Location) { }

  cancel() {
    this.location.back(); // <-- go back to previous location on cancel
  }
}

Ответ 3

Протестировано с Angular 5.2.9

Если вы используете привязку вместо кнопки, вы должны сделать ее пассивной ссылкой с помощью href="javascript:void(0)" чтобы Angular Location работал.

app.component.ts

import { Component } from '@angular/core';
import { Location } from '@angular/common';

@Component({
  selector: 'app-root',
  templateUrl: './app.component.html',
  styleUrls: [ './app.component.css' ]
})
export class AppComponent {

  constructor( private location: Location ) { 
  }

  goBack() {
    // window.history.back();
    this.location.back();

    console.log( 'goBack()...' );
  }
}

app.component.html

<!-- anchor must be a passive link -->
<a href="javascript:void(0)" (click)="goBack()">
  <-Back
</a>

Ответ 4

Вы можете реализовать routerOnActivate() в своем классе маршрута, он предоставит информацию о предыдущем маршруте.

routerOnActivate(nextInstruction: ComponentInstruction, prevInstruction: ComponentInstruction) : any

Затем вы можете использовать router.navigateByUrl() и передавать данные, сгенерированные из ComponentInstruction. Например:

this._router.navigateByUrl(prevInstruction.urlPath);

Ответ 5

Я сделал кнопку, которую можно использовать в любом месте моего приложения.

Создать этот компонент

import { Location } from '@angular/common';
import { Component, Input } from '@angular/core';

@Component({
    selector: 'back-button',
    template: '<button mat-button (click)="goBack()" [color]="color">Back</button>',
})
export class BackButtonComponent {
    @Input()color: string;

  constructor(private location: Location) { }

  goBack() {
    this.location.back();
  }
}

Затем добавьте его в любой шаблон, когда вам нужна кнопка возврата.

<back-button color="primary"></back-button>

Примечание: это использует Angular Material, если вы не используете эту библиотеку, тогда удалите mat-button и color.

Ответ 6

Также работать для меня, когда мне нужно вернуться назад, как в файловой системе. PS @angular: "^ 5.0.0"

<button type="button" class="btn btn-primary" routerLink="../">Back</button>

Ответ 7

<button backButton>BACK</button>

Вы можете поместить это в директиву, которая может быть присоединена к любому активному элементу:

import { Directive, HostListener } from '@angular/core';
import { Location } from '@angular/common';

@Directive({
    selector: '[backButton]'
})
export class BackButtonDirective {
    constructor(private location: Location) { }

    @HostListener('click')
    onClick() {
        this.location.back();
    }
}

Использование:

<button backButton>BACK</button>

Ответ 8

В RC4:

import {Location} from '@angular/common';

Ответ 9

То, как я это делал при навигации по другой странице, добавляет параметр запроса, передавая текущее местоположение

this.router.navigate(["user/edit"], { queryParams: { returnUrl: this.router.url }

Прочитайте этот параметр запроса в своем компоненте

this.router.queryParams.subscribe((params) => {
    this.returnUrl = params.returnUrl;
});

Если присутствует returnUrl, активируйте кнопку "Назад" и когда пользователь нажимает кнопку "Назад"

this.router.navigateByUrl(this.returnUrl); // Hint taken from Sasxa

Это позволит перейти на предыдущую страницу. Вместо использования location.back я считаю, что вышеописанный метод более безопасен, рассмотрим случай, когда пользователь непосредственно приземляется на вашу страницу, и если он нажмет кнопку "Назад" с помощью location.back, он перенаправит пользователя на предыдущую страницу, которая не будет вашей веб-страницей.

Ответ 10

После всех этих удивительных ответов, я надеюсь, что мой ответ найдет кого-то и поможет им. Я написал небольшой сервис для отслеживания истории маршрутов. Здесь это идет.

import { Injectable } from '@angular/core';
import { NavigationEnd, Router } from '@angular/router';
import { filter } from 'rxjs/operators';

@Injectable()
export class RouteInterceptorService {
  private _previousUrl: string;
  private _currentUrl: string;
  private _routeHistory: string[];

  constructor(router: Router) {
    this._routeHistory = [];
    router.events
      .pipe(filter(event => event instanceof NavigationEnd))
      .subscribe((event: NavigationEnd) => {
        this._setURLs(event);
      });
  }

  private _setURLs(event: NavigationEnd): void {
    const tempUrl = this._currentUrl;
    this._previousUrl = tempUrl;
    this._currentUrl = event.urlAfterRedirects;
    this._routeHistory.push(event.urlAfterRedirects);
  }

  get previousUrl(): string {
    return this._previousUrl;
  }

  get currentUrl(): string {
    return this._currentUrl;
  }

  get routeHistory(): string[] {
    return this._routeHistory;
  }
}

Ответ 12

Так как бета 18:

import {Location} from 'angular2/platform/common';

Ответ 13

Другое решение

window.history.back();