Saya mencari untuk mendeteksi perubahan rute di AppComponent
.
Setelah itu saya akan memeriksa token pengguna global untuk melihat apakah dia masuk. Lalu saya bisa mengarahkan pengguna jika dia tidak masuk.
Dalam Angular 2 Anda dapat subscribe
(acara Rx) ke instance Router. Jadi Anda bisa melakukan hal-hal seperti
class MyClass {
constructor(private router: Router) {
router.subscribe((val) => /*whatever*/)
}
}
Edit (sejak rc.1)
class MyClass {
constructor(private router: Router) {
router.changes.subscribe((val) => /*whatever*/)
}
}
Edit 2 (sejak 2.0.0)
lihat juga: Router.events doc
class MyClass {
constructor(private router: Router) {
router.events.subscribe((val) => {
// see also
console.log(val instanceof NavigationEnd)
});
}
}
event._root.children[0].value._routeConfig.data
saya berharap ada cara yang lebih baikfilter
operator RxJS .router.events.pipe(filter(e => e instanceof NavigationEnd).subscribe((e) => { ... }
RxJS 6
Terima kasih kepada Peilonrayz (lihat komentar di bawah)
router baru> = RC.3
Anda juga dapat memfilter berdasarkan peristiwa yang diberikan:
Menggunakan
pairwise
operator untuk mendapatkan acara sebelumnya dan saat ini juga merupakan ide bagus. https://github.com/angular/angular/issues/11268#issuecomment-244601977sumber
Argument of type '(event: Event) => void' is not assignable to parameter of type
Argument of type '(event: Event) => void' is not assignable to parameter of type
kesalahannya adalah karena dalam cuplikan filter Anda, Anda berlangganan objek bertipe Event alih-alih NavigationEvent.Untuk Angular 7 seseorang harus menulis seperti:
this.router.events.subscribe((event: Event) => {})
Contoh terperinci dapat sebagai berikut:
sumber
Sudut 7 , jika Anda ingin
subscribe
untukrouter
sumber
4.x sudut ke atas:
Ini dapat dicapai menggunakan properti url dari kelas ActivatedRoute seperti di bawah ini,
Catatan: Anda perlu mengimpor dan menyuntikkan penyedia dari
angular/router
paketdan
sumber
Router 3.0.0-beta.2 seharusnya
sumber
Dalam angular 6 dan RxJS6:
sumber
import {Router, NavigationEnd} from "@angular/router"
Jawabannya di sini benar
router-deprecated
. Untuk versi terbarurouter
:atau
Untuk melihat perbedaan antara keduanya, silakan lihat pertanyaan SO ini .
Edit
Untuk yang terbaru harus Anda lakukan:
sumber
router
telah diperbarui lagi (saya belum memperbarui jawaban saya belum), jadi saya tidak yakin bagaimana itu adalah untuk yang terbaru. Untuk yangrouter
saya tulis, Anda tidak bisa. @aknDi Angular 8 Anda harus suka
this.router.events.subscribe((event: Event) => {})
Contoh:
sumber
Dalam komponen, Anda mungkin ingin mencoba ini:
sumber
sumber
Lokasi berhasil ...
sumber
di atas sebagian besar solusi yang benar, tetapi saya menghadapi masalah ini memancarkan beberapa kali acara 'Navigasi memancarkan'. Ketika saya mengubah rute apa pun peristiwa ini dipicu. Jadi dengar adalah solusi lengkap untuk Angular 6.
sumber
@Ludohen jawaban bagus, tetapi jika Anda tidak ingin menggunakan
instanceof
gunakan yang berikut inidengan cara ini Anda dapat memeriksa nama acara saat ini sebagai string dan jika acara tersebut terjadi, Anda dapat melakukan apa yang Anda rencanakan untuk dilakukan.
sumber
Event
tipe ini menyebabkan kesalahan pada Atom itu sebabnya saya tidak menggunakannyainstanceOf
sehingga contoh Anda akan bekerja dalam kode produksi juga.if(event instanceOf NavigationStart) {
if(event instanceof NavigationStart)
Saya bekerja dengan aplikasi angular5 dan saya menghadapi masalah yang sama. ketika saya pergi melalui Dokumentasi Sudut mereka memberikan solusi terbaik untuk menangani peristiwa router. periksa dokumentasi berikut.
Perute Router dalam Peristiwa Rute Sudut di angular5
Tetapi khusus untuk kasus ini memberikan pertanyaan yang kita butuhkan Acara NavigationEnd
Navigasi Akhiri Acara Sudut
Bagaimana cara menggunakan ini?
Kapan harus menggunakan ini?
Dalam kasus saya, aplikasi saya berbagi dasbor umum untuk semua pengguna seperti pengguna, Admin, tetapi saya perlu menunjukkan dan menyembunyikan beberapa opsi navbar sesuai jenis pengguna.
Itu sebabnya setiap kali perubahan url saya perlu memanggil metode layanan yang mengembalikan informasi pengguna yang masuk sebagai tanggapan saya akan pergi untuk operasi lebih lanjut.
sumber
JENIS pekerjaan berikut dan mungkin melakukan trik untuk Anda.
Sayangnya ini pengalihan kemudian dalam proses routing dari yang saya inginkan. The
onActivate()
komponen target semula disebut sebelum redirect.Ada
@CanActivate
dekorator yang dapat Anda gunakan pada komponen target tetapi ini a) tidak terpusat dan b) tidak mendapat manfaat dari layanan yang disuntikkan.Alangkah baiknya jika ada yang bisa menyarankan cara yang lebih baik untuk otorisasi rute secara terpusat sebelum dilakukan. Saya yakin pasti ada cara yang lebih baik.
Ini adalah kode saya saat ini (Bagaimana saya mengubahnya untuk mendengarkan perubahan rute?):
sumber
Saya melakukannya seperti ini sejak RC 5
sumber
Buat saja perubahan di AppRoutingModule suka
sumber
Sudut 8. Periksa apakah rute saat ini adalah rute dasar .
sumber
Saya akan menulis sesuatu seperti ini:
sumber
jawaban sederhana untuk Angular 8. *
sumber