angular - navigationend - Cómo volver a la última página
router events subscribe angular 4 (13)
¿Hay alguna forma inteligente de volver a la última página en Angular 2?
Algo como
this._router.navigate(LASTPAGE);
Por ejemplo, la página C tiene un botón Volver ,
-
Página A -> Página C, haga clic en ella, regrese a la página A.
-
Página B -> Página C, haga clic en ella, vuelva a la página B.
¿El enrutador tiene esta información de historial?
<button backButton>BACK</button>
Puede poner esto en una directiva, que se puede adjuntar a cualquier elemento en el que se pueda hacer clic:
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();
}
}
Uso:
<button backButton>BACK</button>
Probado con Angular 5.2.9
Si usa un ancla en lugar de un botón, debe convertirlo en un
enlace pasivo
con
href="javascript:void(0)"
para que funcione la ubicación angular.
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>
Desde beta 18:
import {Location} from ''angular2/platform/common'';
Después de todas estas increíbles respuestas, espero que mi respuesta encuentre a alguien y lo ayude. Escribí un pequeño servicio para hacer un seguimiento del historial de rutas. Aquí va.
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;
}
}
En RC4:
import {Location} from ''@angular/common'';
En la versión final de Angular 2.x / 4.x: aquí están los documentos 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
}
}
En realidad, puede aprovechar el servicio de ubicación integrado, que posee una API "Atrás".
Aquí (en TypeScript):
import {Component} from ''@angular/core'';
import {Location} from ''@angular/common'';
@Component({
// component''s declarations here
})
class SomeComponent {
constructor(private _location: Location)
{}
backClicked() {
this._location.back();
}
}
Hice un botón que puedo reutilizar en cualquier lugar de mi aplicación.
Crea este componente
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();
}
}
Luego agréguelo a cualquier plantilla cuando necesite un botón de retroceso.
<back-button color="primary"></back-button>
Nota: Esto está usando material angular, si no está usando esa biblioteca, elimine el
mat-button
y el
color
.
La forma en que lo hice mientras navegaba a una página diferente agrega un parámetro de consulta pasando la ubicación actual
this.router.navigate(["user/edit"], { queryParams: { returnUrl: this.router.url }
Lea este parámetro de consulta en su componente
this.router.queryParams.subscribe((params) => {
this.returnUrl = params.returnUrl;
});
Si returnUrl está presente, active el botón Atrás y cuando el usuario haga clic en el botón Atrás
this.router.navigateByUrl(this.returnUrl); // Hint taken from Sasxa
Esto debería poder navegar a la página anterior. En lugar de usar location.back, creo que el método anterior es más seguro, considere el caso en el que el usuario accede directamente a su página y si presiona el botón Atrás con location.back, lo redireccionará a la página anterior, que no será su página web.
Otra solución
window.history.back();
Puede implementar el método
routerOnActivate()
en su clase de ruta, proporcionará información sobre la ruta anterior.
routerOnActivate(nextInstruction: ComponentInstruction, prevInstruction: ComponentInstruction) : any
Luego puede usar
router.navigateByUrl()
y pasar los datos generados desde
ComponentInstruction
.
Por ejemplo:
this._router.navigateByUrl(prevInstruction.urlPath);
También funciona para mí cuando necesito retroceder como en el sistema de archivos. PS @angular: "^ 5.0.0"
<button type="button" class="btn btn-primary" routerLink="../">Back</button>
en angular 4 use
preserveQueryParams
, por ejemplo:
url: /list?page=1
<a [routerLink]="[''edit'',id]" [preserveQueryParams]="true"></a>
Al hacer clic en el enlace, se le redirige
edit/10?page=1
, conservando los parámetros
ref: https://angular.io/docs/ts/latest/guide/router.html#!#link-parameters-array