Son sayfaya nasıl dönülür


366

Açısal 2'deki son sayfaya geri dönmenin akıllı bir yolu var mı?

Gibi bir şey

this._router.navigate(LASTPAGE);

Örneğin, C sayfasının bir Go Backdüğmesi vardır,

  • A Sayfası -> C Sayfası, tıklayın, A sayfasına dönün.

  • Sayfa B -> Sayfa C, tıklayın, sayfa B'ye dönün.

Yönlendirici bu geçmiş bilgisine sahip mi?

Yanıtlar:


669

Aslında bir "Geri" API'sı olan yerleşik Konum hizmetinden yararlanabilirsiniz.

Burada (TypeScript'te):

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

Düzenleme : @ charith.arumapperuma tarafından belirtildiği gibi hat önemlidir böylece Locationithal edilmelidir .@angular/commonimport {Location} from '@angular/common';


75
Konum, Açısal 2'nin eski sürümlerinde "açısal2 / yönlendirici" den içe aktarılmalıdır. Daha yeni sürümlerde, "@ açısal / ortak" olmalıdır.
charith.arumapperuma

2
Çerçevede yerleşik varsa, "yerli" "window.history.back ();" kullanmak için herhangi bir neden görmüyorum HTML5 özelliği olan ( developer.mozilla.org/en-US/docs/Web/API/Window/history )
Amir Sasson

7
Değer için, şu Locationdurumlar için resmi Angular2 API belgeleri : "Not: Yönlendirme değişikliklerini tetiklemek için Yönlendirici hizmetini kullanmak daha iyidir. Konum'u yalnızca yönlendirme dışında normalleştirilmiş URL'lerle etkileşim kurmanız veya normalleştirilmiş URL'ler oluşturmanız gerektiğinde kullanın." @ Sasxa'nın cevabı görünüşe göre Routerbunu yapmak için bir yol gösteriyor . Ancak, Locationyöntem kesinlikle daha uygundur. RouterYöntemin neden yöntemden daha doğru olabileceğini bilen var mı Location?
Andrew Willems

2
@Andrew: this.location.back () kullanırsanız, iki kez geri dönemeyeceğiniz sorunla karşılaştım. İlk siteye geri döneceksiniz.
Johannes

1
@ yt61, emin değilim, belki yeniden kullanılabilirlik? veya çeşitli yollardan belirli bir sayfaya gidebiliyorsanız, gideceğiniz yolu önceden bilmiyorsunuzdur.
Amir Sasson

111

Gelen son hali açısal 2.x / 4.x - burada belgeler var 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
  }
}

1
Önceki ekrana geri dönerken, girilen değerleri hizmette bir nesne kullanmadan koruyabiliriz.
Vignesh

Location.back () yürütülürken animasyon nasıl gösterilir?
Kar Üsleri

48

<button backButton>BACK</button>

Bunu, tıklanabilir herhangi bir öğeye eklenebilecek bir yönerge içine koyabilirsiniz:

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

Kullanımı:

<button backButton>BACK</button>

bu harika!
Rafael de Castro

1
Bu sayfayı yenilerseniz ve "this.location.back ()" öğesini tetikleyen düğmeyi tıklatırsanız, sayfanın yenilenmesini tetikler. Konum modülünün önceki yol olup olmadığını algılayabilmesinin bir yolu var mı?
Henry LowCZ

iyi iş adamı! ;)
elciospy

Bir kullanıcı doğrudan Geri düğmesinin bulunduğu bir sayfaya giderse ve bir düğmeyi tıklarsa .. tarayıcı (platform) geçmişine göre uygulamadan bir önceki sayfaya atılır.
hastrb

Gelecekteki okuyucular için API dokümanlarına bakın
hastrb

23

Açısal 5.2.9 ile test edilmiştir

Eğer bir düğmesinin yerine bir çapa kullanırsanız bunu bir yapmalıdır pasif bağlantı ile href="javascript:void(0)"Açısal Yer çalışması için.

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>

Kullanmak yerine bir 'clickPreventDefault' yönergesi oluşturmanızı öneririm javascript:void(0). Gibi bir şey ... @Directive({ selector: '[clickPreventDefault]' }) export class ClickPreventDefaultDirective { @HostListener("click", ["$event"]) onClick($event: Event) { $event.preventDefault(); } }
bmd

Teşekkürler @bmd, daha ayrıntılı bir yol ama işe yarıyor. Başka bir çalışma çözümü herf kullanmayın: <a (click)="goBack()"> bu şekilde HTML Doğrulayıcıları geçmez.
JavierFuentes

20

routerOnActivate()Rota sınıfınıza yöntem uygulayabilirsiniz , önceki rota hakkında bilgi sağlayacaktır.

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

Ardından, router.navigateByUrl()oluşturulan verileri kullanabilir ve iletebilirsiniz ComponentInstruction. Örneğin:

this._router.navigateByUrl(prevInstruction.urlPath);

Bu hala Açısal 2.1.0 için geçerli mi?
smartmouse

1
@smartmouse Ben öyle düşünmüyorum, için belgeler varrouterOnActivate
Bojan Kogoj

4
Bu yanıttaki yönlendiriciOnActivate () bağlantısı kopuk. Bu sürümde bunu yapmanın yolu değil gibi görünüyor.
rmcsharry

14

Dosya sisteminde olduğu gibi geri hareket etmem gerektiğinde de benim için çalış. PS @ açısal: "^ 5.0.0"

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

7
Bunun işe yarayacağını umuyordum, ancak bu, bir sonraki Rotaya geri dönüyor - sayfaya gitmeden önce bulunduğunuz rotaya değil. Bunun var olduğunu bilmek güzel, ancak bileşeniniz için birden fazla giriş noktanız varsa, bu yöntem nereden geldiğinize değil, yalnızca yukarıdaki rotaya geri döner.
Scott Byers

"Dosya sisteminde olduğu gibi geri dönmem gerektiğinde" yazdığım gibi :) Benim için bu davranış da beklenmedikti.
Shevtsiv Andriy

12

Uygulamamın herhangi bir yerinde tekrar kullanabileceğim bir düğme yaptım.

Bu bileşeni oluştur

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

Ardından geri düğmesine ihtiyacınız olduğunda şablonu herhangi bir şablona ekleyin.

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

Not: Bu, daha sonra kaldırmak o kütüphaneyi kullanmıyorsanız, Açısal Malzeme kullanıyor mat-buttonve color.


Bu yaklaşım, adlandırılmış yönlendirici çıkışlarıyla çalışır mı? Diyelim ki sayfada birkaç tane var ve bunlardan sadece birine geri dönmek istiyorum, bu işe yarar mı?
rrd

Bu durum için farklı bir yaklaşım kullanmanız gerekecek. İki farklı yönlendirici çıkışında aynı geri düğmesine sahipseniz, muhtemelen ikisi de aynı şeyi yapar ve değiştirilen son yönlendirici çıkışına geri döner.
Todd Skelton

Adlandırılmış çıkışlar için bu yaklaşımın işe yaradığını buldum: this.router.navigate (['../'], {relativeTo: this.route})
rrd

Bu bileşen başka bir bileşen içinde nasıl kullanılır?
RN Kushwaha

12

Tüm bu harika cevaplardan sonra, umarım cevabım birini bulur ve onlara yardım eder. Güzergah geçmişini takip etmek için küçük bir hizmet yazdım. İşte gidiyor.

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

Az ya da çok tüm çözümleri denedikten sonra, bunu yapmanın daha tutarlı bir yolu olduğunu düşünüyorum
A. D'Alfonso

Sayfayı belirli bir bağlantıda açarsam ve sayfanın sayfa ağacındaki sayfaya geri dönmesini istersem ne olur?
Ivan

8

Farklı bir sayfaya giderken yaptığım yol, geçerli konumu geçerek bir sorgu parametresi eklemek

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

Bileşeninizdeki bu sorgu parametresini okuyun

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

ReturnUrl varsa geri düğmesini etkinleştirin ve kullanıcı geri düğmesini tıkladığında

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

Bu, önceki sayfaya gidebilmelidir. Location.back kullanmak yerine, yukarıdaki yöntemin daha güvenli olduğunu hissediyorum, kullanıcının doğrudan sayfanıza geldiği durumu düşünün ve location.back ile geri düğmesine basarsa, kullanıcıyı web sayfanız olmayacak bir önceki sayfaya yönlendirir.


ActivatedRoute'u içe aktarmanız ve queryParams aboneliğinde (örneğin, this.route.queryParams.subscribe) Router yerine kullanmanız gerekiyor, ancak aksi halde çalışıyor gibi görünüyor!
Stephen Kaiser

benim için açısal 4 bile yönlendirici kendisi ile iyi çalışıyor
Puneeth Rai

1
En iyi yanıt, ancak Açısal 5'te (x'e kadar?) "ActivatedRoute" nesnesini enjekte etmeniz ve Stephen Kaiser'in belirttiği gibi bu nesne üzerinde queryParams kullanmanız gerekir.
Satria


3

Sayfayı yenilemeden geri dönmek için, javascript: history.back () gibi html ile yapabiliriz

<a class="btn btn-danger" href="javascript:history.back()">Go Back</a>

Bunun Locationyerine hizmeti kullanmanızı tavsiye ederim . resmi API
hastrb

2

Beta 18'den beri:

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



2

Başka bir çözüm

window.history.back();


Works for me location.back () da çalışıyor ama ben --prod ile derlemek değil
Alex
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.