page navigationend change angular angular2-routing

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>