Как вернуться на предыдущую страницу
Есть ли умный способ вернуться на последнюю страницу в 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;
}
}
Ответ 11
в angular 4 используйте preserveQueryParams
, например:
url: /list?page=1
<a [routerLink]="['edit',id]" [preserveQueryParams]="true"></a>
При нажатии ссылки вы перенаправлены edit/10?page=1
, сохраняя параметры
ref: https://angular.io/docs/ts/latest/guide/router.html#!#link-parameters-array
Ответ 12
Так как бета 18:
import {Location} from 'angular2/platform/common';
Ответ 13
Другое решение
window.history.back();