Saya menggunakan sudut 2 dengan strategi hashlocation.
Komponen dimuat dengan rute itu:
"departments/:id/employees"
Sejauh ini baik-baik saja.
Setelah saya melakukan penyimpanan batch yang berhasil dari beberapa baris tabel yang diedit, saya ingin memuat ulang url rute saat ini melalui:
this.router.navigate([`departments/${this.id}/employees`]);
Tapi tidak ada yang terjadi, kenapa?
Jawaban:
Jika navigasi Anda () tidak mengubah URL yang sudah ditampilkan di bilah alamat browser Anda, router tidak ada hubungannya. Bukan tugas router untuk menyegarkan data. Jika Anda ingin menyegarkan data, buat layanan yang dimasukkan ke dalam komponen dan aktifkan fungsi beban pada layanan tersebut. Jika data baru akan diambil, itu akan memperbarui tampilan melalui binding.
sumber
Ini sekarang dapat dilakukan di Angular 5.1 menggunakan
onSameUrlNavigation
properti konfigurasi Router.Saya telah menambahkan sebuah blog yang menjelaskan bagaimana di sini tetapi intinya adalah sebagai berikut
https://medium.com/engineering-on-the-incline/reloading-current-route-on-click-angular-5-1a1bfc740ab2
Di
onSameUrlNavigation
opsi mengaktifkan konfigurasi router Anda , atur ke'reload'
. Hal ini menyebabkan Router mengaktifkan siklus peristiwa saat Anda mencoba menavigasi ke rute yang sudah aktif.Dalam definisi rute Anda, setel
runGuardsAndResolvers
kealways
. Ini akan memberi tahu router untuk selalu memulai siklus penjaga dan resolver, menjalankan peristiwa terkait.Terakhir, di setiap komponen yang ingin Anda aktifkan pemuatan ulang, Anda perlu menangani kejadian tersebut. Ini dapat dilakukan dengan mengimpor router, mengikat kejadian dan menjalankan metode inisialisasi yang menyetel ulang status komponen Anda dan mengambil ulang data jika diperlukan.
Dengan semua langkah ini di tempat, Anda harus mengaktifkan pemuatan ulang rute.
sumber
init
fungsi,init
?Buat fungsi di pengontrol yang mengarahkan ulang ke rute yang diharapkan seperti itu
lalu gunakan seperti ini
fungsi ini akan mengarahkan ke dummy route dan dengan cepat kembali ke rute tujuan tanpa pengguna menyadarinya.
sumber
'/'
sebagai pengganti'/DummyComponent'
EDIT
Untuk versi Angular (5.1+) yang lebih baru, gunakan jawaban yang disarankan oleh @Simon McClive
Jawaban lama
Saya menemukan solusi ini pada permintaan fitur GitHub untuk Angular:
Saya mencoba menambahkan ini ke fungsi app.component.ts saya
ngOnInit
, dan itu pasti berhasil. Semua klik lebih lanjut pada tautan yang sama sekarang memuat ulangcomponent
data dan.Tautkan ke permintaan fitur GitHub asli
Kredit diberikan ke mihaicux2 di GitHub.
Saya menguji ini pada versi
4.0.0-rc.3
denganimport { Router, NavigationEnd } from '@angular/router';
sumber
Sedikit rumit: gunakan jalur yang sama dengan beberapa parameter dummy. Sebagai contoh-
sumber
this.router.navigate(['/pocetna'], { queryParams: { 'refresh': 1 } });
dan diroute.queryParams.subscribe(val => myRefreshMethod())
manaroute: ActivatedRoute
disuntikkan dalam komponen segar ... Semoga bisa membantuSaya menggunakan yang ini untuk proyek Angular 10:
PS: Diuji dan bekerja juga pada "Angular 7, 8, 9"
sumber
Ini bekerja untuk saya seperti pesona
sumber
Retas reload rute 2-4 sudut
Bagi saya, menggunakan metode ini di dalam komponen root (komponen, yang ada di rute mana pun) berfungsi:
sumber
Inilah yang saya lakukan dengan Angular 9 . Saya tidak yakin apakah ini berfungsi di versi yang lebih lama.
Anda harus memanggil ini saat Anda perlu memuat ulang.
Router forRoot harus memiliki SameUrlNavigation yang disetel ke 'reload'
Dan setiap rute Anda harus memiliki runGuardsAndResolvers yang disetel ke 'selalu'
sumber
Pada halaman muat ulang perubahan param tidak akan terjadi. Ini adalah fitur yang sangat bagus. Tidak perlu memuat ulang halaman tetapi kita harus mengubah nilai komponennya. Metode paramChange akan memanggil perubahan url. Jadi kita bisa mengupdate data komponen
sumber
Sejauh yang saya tahu ini tidak dapat dilakukan dengan router di Angular 2. Tapi Anda bisa melakukan:
Untuk memuat ulang tampilan.
sumber
Bagi saya bekerja dengan hardcoding
sumber
Temukan solusi cepat dan langsung yang tidak perlu mengutak-atik cara kerja sudut dalam:
Pada dasarnya: Buat saja rute alternatif dengan modul tujuan yang sama dan cukup beralih di antara mereka:
Dan berikut menu toggelingnya:
Semoga membantu :)
sumber
Sedikit hardcore tapi
sumber
Dalam kasus saya:
bekerja dengan benar
sumber
implementasikan OnInit dan panggil ngOnInit () dalam metode untuk route.navigate ()
Lihat contoh:
sumber
Memecahkan skenario serupa dengan menggunakan komponen dummy dan rute untuk
reload
, yang sebenarnya melakukan aredirect
. Ini jelas tidak mencakup semua skenario pengguna tetapi hanya berfungsi untuk skenario saya.Perutean dihubungkan dengan kabel untuk menangkap semua url menggunakan karakter pengganti:
Untuk menggunakan ini, kita hanya perlu menambahkan reload ke url yang ingin kita tuju:
sumber
Solusinya adalah dengan melewatkan parameter dummy (yaitu waktu dalam detik), dengan cara ini tautan selalu dimuat ulang:
sumber
Ada pendekatan berbeda untuk menyegarkan rute saat ini
Ubah perilaku router (Sejak Angular 5.1) Atur router onSameUrlNavigation ke 'reload'. Ini akan memancarkan acara router pada Navigasi URL yang sama.
Biarkan router tidak tersentuh
Saya telah menulis penjelasan yang lebih rinci di bawah https://medium.com/@kevinkreuzer/refresh-current-route-in-angular-512a19d58f6e
Semoga ini membantu.
sumber
Saya menggunakan
setTimeout
dannavigationByUrl
untuk memecahkan masalah ini ... Dan ini bekerja dengan baik untuk saya.Itu dialihkan ke URL lain dan sebagai gantinya muncul lagi di URL saat ini ...
sumber
Misalkan rute komponen yang ingin Anda refresh adalah
view
, gunakan ini:Anda dapat menambahkan
debugger
di dalam metode untuk mengetahui rute pasti yang akan datang setelah menavigasi ke"departments/:id/employees"
.sumber
Sangat membuat frustrasi karena Angular sepertinya masih belum menyertakan solusi yang baik untuk ini. Saya telah mengangkat masalah github di sini: https://github.com/angular/angular/issues/31843
Sementara itu, ini adalah solusi saya. Ini dibangun di atas beberapa solusi lain yang disarankan di atas, tetapi saya pikir ini sedikit lebih kuat. Ini melibatkan pembungkus layanan Router dalam "
ReloadRouter
", yang menangani fungsionalitas muat ulang dan juga menambahkan aRELOAD_PLACEHOLDER
ke konfigurasi router inti. Ini digunakan untuk navigasi sementara dan menghindari memicu rute lain (atau penjaga).Catatan: Gunakan hanya
ReloadRouter
jika Anda menginginkan fungsionalitas muat ulang. Gunakan normalRouter
jika tidak.sumber
Impor
Router
danActivatedRoute
dari@angular/router
Menyuntikkan
Router
danActivatedRoute
(jika Anda membutuhkan sesuatu dari URL)Dapatkan parameter apa pun jika diperlukan dari URL.
Menggunakan trik dengan menavigasi ke dummy atau url utama kemudian ke url sebenarnya akan menyegarkan komponen.
Dalam kasus Anda
Jika Anda menggunakan rute dummy maka Anda akan melihat judul berkedip 'Tidak Ditemukan' jika Anda telah menerapkan url tidak ditemukan jika tidak cocok dengan url mana pun.
sumber
berlangganan perubahan parameter rute
sumber
Jika Anda mengubah rute melalui Tautan Router Ikuti ini:
sumber
Saya yakin ini telah diselesaikan (secara native) di Angular 6+; memeriksa
di sini https://github.com/angular/angular/issues/13831 &&
dan di sini https://medium.com/engineering-on-the-incline/reloading-current-route-on-click-angular-5-1a1bfc740ab2
Tapi ini berfungsi untuk seluruh rute (termasuk semua rute anak juga)
Jika Anda ingin menargetkan satu komponen, berikut caranya: Gunakan parameter kueri yang berubah, sehingga Anda dapat menavigasi sebanyak yang Anda inginkan.
Di titik navigasi (kelas)
Di Komponen yang ingin Anda "segarkan / muat ulang"
sumber
queryParamsMap
subjek hanya diperbarui pertama kali, tetapi tidak pada pembaruan berikutnya.Memutuskan kapan rute harus disimpan return false to
this.router.routeReuseStrategy.shouldReuseRoute = function () { return false; };
dan setel nilai navigasi router ke false, yang menunjukkan bahwa rute ini tidak pernah dirutekan
this.mySubscription = this.router.events.subscribe(event => { if (event instanceof NavigationEnd) { this.router.navigated = false; } });
sumber
Saya telah mencoba beberapa perbaikan dan tidak ada yang berhasil. Versi saya sederhana: tambahkan parameter baru yang tidak digunakan ke dalam parameter kueri
sumber
window.location.replace
// gunakan backtick untuk menyertakan rute
window.location.replace (
departments/${this.id}/employees
)sumber
Kode di bawah ini akan berfungsi:
sumber