Misalkan saya saat ini berada di halaman yang memiliki URL /user/:id
. Sekarang dari halaman ini saya menavigasi ke halaman berikutnya :id/posts
.
Sekarang apakah ada cara, sehingga saya dapat memeriksa apa URL sebelumnya, yaitu /user/:id
.
Berikut adalah rute saya
export const routes: Routes = [
{
path: 'user/:id', component: UserProfileComponent
},
{
path: ':id/posts', component: UserPostsComponet
}
];
angular
angular2-routing
Chandra Shekhar
sumber
sumber
null
karena tidak ada rute sebelumnya. Anda juga perlu melakukan ini di root router, jika tidak, Anda hanya akan mendapatkannya saat menavigasi di antara rute turunan komponen ini.Mungkin semua jawaban lainnya adalah untuk sudut 2.X.
Sekarang tidak berfungsi untuk sudut 5.X. Saya sedang mengerjakannya.
hanya dengan NavigationEnd, Anda tidak bisa mendapatkan url sebelumnya.
karena Router bekerja dari "NavigationStart", "RoutesRecognized", ..., hingga "NavigationEnd".
Anda bisa mengeceknya dengan
Tapi tetap saja Anda tidak bisa mendapatkan url sebelumnya bahkan dengan "NavigationStart".
Sekarang Anda perlu menggunakan berpasangan.
Dengan berpasangan, Anda dapat melihat asal dan tujuan url.
"RoutesRecognized" adalah langkah perubahan dari asal ke url target.
jadi filter dan dapatkan url sebelumnya darinya.
Terakhir tapi bukan yang akhir,
letakkan kode ini di komponen induk atau yang lebih tinggi (mis., app.component.ts)
karena kode ini aktif setelah perutean selesai.
Perbarui sudut 6+
The
events.filter
memberikan kesalahan karena filter bukan bagian dari acara, sehingga mengubah kode untuksumber
Buat layanan injeksi:
import { Injectable } from '@angular/core'; import { Router, RouterEvent, NavigationEnd } from '@angular/router'; /** A router wrapper, adding extra functions. */ @Injectable() export class RouterExtService { private previousUrl: string = undefined; private currentUrl: string = undefined; constructor(private router : Router) { this.currentUrl = this.router.url; router.events.subscribe(event => { if (event instanceof NavigationEnd) { this.previousUrl = this.currentUrl; this.currentUrl = event.url; }; }); } public getPreviousUrl(){ return this.previousUrl; } }
Kemudian gunakan di mana pun Anda membutuhkannya. Untuk menyimpan variabel saat ini sesegera mungkin, Anda perlu menggunakan layanan di AppModule.
// AppModule export class AppModule { constructor(private routerExtService: RouterExtService){} //... } // Using in SomeComponent export class SomeComponent implements OnInit { constructor(private routerExtService: RouterExtService, private location: Location) { } public back(): void { this.location.back(); } //Strange name, but it makes sense. Behind the scenes, we are pushing to history the previous url public goToPrevious(): void { let previous = this.routerExtService.getPreviousUrl(); if(previous) this.routerExtService.router.navigateByUrl(previous); } //... }
sumber
@NgModule({ ..., providers: [RouterExtService]}) export class AppRoutingModule { }
routerExtService.getPreviousUrl()
metode dalam konstruktor layanan yang digunakan dalam komponen. Untuk beberapa alasan ini disebut lebih awal dari pembaruan yang sebenarnya. Artinya kita memiliki ketergantungan waktu! Saya pikir lebih mudah menggunakan Subjek.let params = new HttpParams({fromString: retrieveURL}).set('name', 'victor') const paramsObject = params.keys().reduce((obj, key) => { obj[key] = params.get(key) return obj }, {}) this.router.navigate([paramsObject], { relativeTo: this.route })
Angular 6 memperbarui kode untuk mendapatkan url sebelumnya sebagai string.
sumber
Ini bekerja untuk saya dalam versi angular> = 6.x:
sumber
Saya menggunakan Angular 8 dan jawaban dari @ franklin-pious memecahkan masalah. Dalam kasus saya, dapatkan url sebelumnya di dalam langganan menyebabkan beberapa efek samping jika dilampirkan dengan beberapa data dalam tampilan.
Solusi yang saya gunakan adalah mengirim url sebelumnya sebagai parameter opsional dalam navigasi rute.
Dan untuk mendapatkan nilai ini di komponen:
this.router dan this.route dimasukkan ke dalam konstruktor setiap komponen dan diimpor sebagai anggota @ angular / router.
sumber
Angular 8 & rxjs 6 pada versi 2019
Saya ingin berbagi solusi berdasarkan solusi hebat lainnya.
Pertama-tama buat layanan untuk mendengarkan perubahan rute dan simpan rute terakhir sebelumnya di Subjek Perilaku, lalu sediakan layanan ini di app.component utama di konstruktor lalu gunakan layanan ini untuk mendapatkan rute sebelumnya yang Anda inginkan kapan pun Anda mau.
kasus penggunaan: Anda ingin mengarahkan pengguna ke halaman beriklan kemudian secara otomatis mengarahkannya ke tempat asalnya sehingga Anda memerlukan rute terakhir sebelumnya untuk melakukannya.
// service : route-events.service.ts import { Injectable } from '@angular/core'; import { Router, RoutesRecognized } from '@angular/router'; import { BehaviorSubject } from 'rxjs'; import { filter, pairwise } from 'rxjs/operators'; import { Location } from '@angular/common'; @Injectable() export class RouteEventsService { // save the previous route public previousRoutePath = new BehaviorSubject<string>(''); constructor( private router: Router, private location: Location ) { // ..initial prvious route will be the current path for now this.previousRoutePath.next(this.location.path()); // on every route change take the two events of two routes changed(using pairwise) // and save the old one in a behavious subject to access it in another component // we can use if another component like intro-advertise need the previous route // because he need to redirect the user to where he did came from. this.router.events.pipe( filter(e => e instanceof RoutesRecognized), pairwise(), ) .subscribe((event: any[]) => { this.previousRoutePath.next(event[0].urlAfterRedirects); }); } }
menyediakan layanan di app.module
Masukkan di app.component
constructor( private routeEventsService: RouteEventsService )
terakhir gunakan rute sebelumnya yang disimpan di komponen yang Anda inginkan
onSkipHandler(){ // navigate the user to where he did came from this.router.navigate([this.routeEventsService.previousRoutePath.value]); }
sumber
@Injectable({ providedIn: 'root' })
layanan, secara otomatis dimuat ke dalam modul root (AppModule) proyek dan karenanya Anda tidak perlu menyediakannya secara manual keapp.module
. Lihat dokumen untuk detailnya. Tidak perlu berhenti berlangganan dari Observables router seperti yang dinyatakan dalam jawabanUNTUK ANGULAR 7+
Sebenarnya sejak Angular 7.2 tidak perlu menggunakan layanan untuk menyimpan url sebelumnya. Anda bisa menggunakan objek status untuk menyetel url terakhir sebelum menautkan ke halaman login. Berikut adalah contoh skenario login.
@Component({ ... }) class SomePageComponent { constructor(private router: Router) {} checkLogin() { if (!this.auth.loggedIn()) { this.router.navigate(['login'], { state: { redirect: this.router.url } }); } } }
----------------@Component({...}) class LoginComponent { constructor(private router: Router) {} backToPreviousPage() { const { redirect } = window.history.state; this.router.navigateByUrl(redirect || '/homepage'); } }
Selain itu, Anda juga bisa meneruskan data di template:
@Component({ template: '<a routerLink="/some-route" [state]="{ redirect: router.url}">Go to some route</a>' }) class SomePageComponent { constructor(public router: Router) {} }
sumber
@ GünterZöchbauer juga Anda dapat menyimpannya di penyimpanan lokal tetapi saya tidak lebih suka) lebih baik menyimpan dalam layanan dan mendapatkan nilai ini dari sana
sumber
Anda dapat menggunakan Lokasi seperti yang disebutkan di sini .
Ini kode saya jika tautan dibuka di tab baru
Impor yang dibutuhkan
sumber
Cukup sederhana dengan menggunakan
previousNavigation
objek:sumber
Saya kesulitan mengakses url sebelumnya di dalam penjaga.
Tanpa menerapkan solusi khusus, yang ini berfungsi untuk saya.
public constructor(private readonly router: Router) { }; public ngOnInit() { this.router.getCurrentNavigation().previousNavigation.initialUrl.toString(); }
Url awal akan menjadi halaman url sebelumnya.
sumber
Semua JAWABAN Di Atas akan memuat URL beberapa kali. Jika pengguna mengunjungi komponen lain juga, kode ini akan dimuat.
Jadi lebih baik untuk digunakan, Konsep pembuatan layanan. https://community.wia.io/d/22-access-the-previous-route-in-your-angular-5-app
Ini akan bekerja dengan baik di semua versi Angular. (pastikan untuk menambahkannya ke array provider di file app.module Anda!)
sumber
Menggunakan berpasangan dari rxjx Anda dapat mencapai ini dengan lebih mudah. impor {filter, pairwise} dari 'rxjs / operator';
}
sumber
Saya mengalami masalah serupa ketika saya ingin kembali ke halaman sebelumnya. Solusi lebih mudah dari yang bisa saya bayangkan.
Dan itu kembali ke url induk. Saya berharap ini akan membantu seseorang;)
sumber