Cara memuat ulang rute saat ini dengan router 2 sudut

156

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?

Pascal
sumber
Lihatlah jawaban ini untuk pertanyaan serupa: stackoverflow.com/a/44580036/550975
Serj Sagan
tech-blog.maddyzone.com/angularjs/javascript/… sangat membantu
Rituraj ratan

Jawaban:

52

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.

Yakov Fain
sumber
2
Sekarang Anda mengatakannya, saya harus setuju TAPI ... router angularjs ui memiliki opsi muat ulang sehingga memuat ulang rute adalah opiniated ;-) Tapi ya saya bisa melakukan muat ulang data thx untuk tip itu yang sebenarnya sudah jelas ...
Pascal
91
Saya tidak setuju bagaimana jika Anda ingin menjalankan kembali penjaga, katakanlah jika seseorang keluar?
Jackie
1
@Jackie Saya berpikir bahwa mungkin Anda bisa menjalankan kembali penjaga ... jika mereka memiliki pengalihan bawaan, maka itu mungkin berhasil.
OldTimeGuitarGuy
12
@YakovFain maaf, tapi ini salah. Ini berarti Anda sekarang memiliki dua sumber kebenaran untuk perilaku rute - satu terjadi selama penjagaan, yang lainnya terjadi dalam komponen. Tidak hanya sekarang Anda berpotensi menduplikasi logika, Anda juga melawan aliran data yang lebih alami: 1. buat perubahan pada API, 2. segarkan rute untuk mengambil status baru data dari API, menjadikan API sebagai sumber kebenaran. Tidak ada alasan untuk TIDAK memberi pengguna kemampuan untuk memicu ulang rute secara manual sehingga aliran data alami dapat terjadi lagi.
AgmLauncher
4
Saya rasa ini bukan jawaban yang bagus. Router harus menjadi sumber kebenaran untuk data Anda. Jika Anda harus memuatnya kembali melalui layanan terpisah, maka router tidak lagi mengetahui tentang versi terbaru dan komponen Anda tidak dapat lagi mengandalkan router Anda sebagai sumber kebenaran.
Dan King
139

Ini sekarang dapat dilakukan di Angular 5.1 menggunakan onSameUrlNavigationproperti 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 onSameUrlNavigationopsi mengaktifkan konfigurasi router Anda , atur ke 'reload'. Hal ini menyebabkan Router mengaktifkan siklus peristiwa saat Anda mencoba menavigasi ke rute yang sudah aktif.

@ngModule({
 imports: [RouterModule.forRoot(routes, {onSameUrlNavigation: 'reload'})],
 exports: [RouterModule],
 })

Dalam definisi rute Anda, setel runGuardsAndResolverske always. Ini akan memberi tahu router untuk selalu memulai siklus penjaga dan resolver, menjalankan peristiwa terkait.

export const routes: Routes = [
 {
   path: 'invites',
   component: InviteComponent,
   children: [
     {
       path: '',
       loadChildren: './pages/invites/invites.module#InvitesModule',
     },
   ],
   canActivate: [AuthenticationGuard],
   runGuardsAndResolvers: 'always',
 }
]

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.

export class InviteComponent implements OnInit, OnDestroy {
 navigationSubscription;     

 constructor(
   // … your declarations here
   private router: Router,
 ) {
   // subscribe to the router events. Store the subscription so we can
   // unsubscribe later.
   this.navigationSubscription = this.router.events.subscribe((e: any) => {
     // If it is a NavigationEnd event re-initalise the component
     if (e instanceof NavigationEnd) {
       this.initialiseInvites();
     }
   });
 }

 initialiseInvites() {
   // Set default values and re-fetch any data you need.
 }

 ngOnDestroy() {
   if (this.navigationSubscription) {
     this.navigationSubscription.unsubscribe();
   }
 }
}

Dengan semua langkah ini di tempat, Anda harus mengaktifkan pemuatan ulang rute.

Simon McClive
sumber
1
Apakah ada cara untuk memuat ulang komponen daripada memanggil initfungsi,
Ebraheem Alrabeea
Saya rasa tidak ... kecuali Anda menavigasi keluar dari rute dan kembali lagi. Fungsi init bukanlah akhir dunia, Anda dapat mengontrol inisialisasi ke titik yang memiliki efek yang sama seperti memuat ulang komponen. Adakah alasan khusus Anda ingin melakukan full reload tanpa init?
Simon McClive
Saya telah menemukan solusi untuk masalah saya, Terima kasih atas tanggapan Anda dan blog itu bermanfaat.
Ebraheem Alrabeea
Bagaimana melakukannya di Angular 4 selain reload jendela.
Vishakha
Berfungsi bagus untuk aplikasi Angular5 saya! Berhenti berlangganan ngOnDestroy () agak penting - menarik bila Anda tidak melakukannya :-)
BobC
135

Buat fungsi di pengontrol yang mengarahkan ulang ke rute yang diharapkan seperti itu

redirectTo(uri:string){
   this.router.navigateByUrl('/', {skipLocationChange: true}).then(()=>
   this.router.navigate([uri]));
}

lalu gunakan seperti ini

this.redirectTo('//place your uri here');

fungsi ini akan mengarahkan ke dummy route dan dengan cepat kembali ke rute tujuan tanpa pengguna menyadarinya.

theo sharkson
sumber
4
Terima kasih! Solusi terbaik disini.
Alan Smith
Solusi ini berfungsi dengan baik, kami dapat menggunakan ini sampai kami mendapatkan yang lebih baik. Terima kasih @theo.
Sibeesh Venu
13
ini bekerja seperti pesona ketika saya digunakan '/'sebagai pengganti'/DummyComponent'
suhailvs
2
Berfungsi dengan baik di Angular 7, tanpa masalah di riwayat browser. Saya memilih untuk menggunakan solusi ini karena ditargetkan ke komponen tertentu. Menurut saya, memuat ulang halaman yang sama umumnya merupakan kasus yang tidak normal, jadi membuat seluruh aplikasi mengikuti paradigma tertentu sepertinya berlebihan. Ini kecil dan lebih mudah diterapkan daripada solusi lain.
JE Carter II
3
Oke berhasil, tetapi ... ini akan memuat ulang HomeComponent Anda (atau apa pun yang Anda miliki di rute "/"), akan menjalani siklus hidup penuh ngOnInit / ngOnDestroy secara gratis. Lebih baik memiliki rute tertentu dengan beberapa komponen tiruan dan ringan atau Anda akan melihat kelambatannya
petronius
77

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:

this._router.routeReuseStrategy.shouldReuseRoute = function(){
    return false;
};

this._router.events.subscribe((evt) => {
    if (evt instanceof NavigationEnd) {
        this._router.navigated = false;
        window.scrollTo(0, 0);
    }
});

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 ulang componentdata dan.

Tautkan ke permintaan fitur GitHub asli

Kredit diberikan ke mihaicux2 di GitHub.

Saya menguji ini pada versi 4.0.0-rc.3denganimport { Router, NavigationEnd } from '@angular/router';

Arg0n
sumber
1
Baru saja mencoba ini di Angular 4.4.x dan ini sepenuhnya berfungsi. Terima kasih!
Tim Mindsect
1
Ini berfungsi dengan baik bagi saya, sampai saya menerapkan bilah-tab Material untuk menavigasi melalui rute turunan dari setiap rute induk di aplikasi saya. Setelah pengguna membuka halaman yang menjalankan kode ini, bilah tinta animasi akan menghilang. (Mengapa? Saya tidak punya cukup waktu atau ruang untuk menjelaskan ...)
andreisrob
3
Ini ide yang sangat buruk - ActivatedRoute Anda sekarang akan selalu sama.
artuska
1
@AnandTyagi Coba solusi SimonMcClives jika Anda menggunakan Angular 5.1+. Mungkin itu bekerja lebih baik untuk Anda.
Arg0n
2
Ide yang sangat buruk ... Karena setelah menerapkan routeReuseStrategy.shouldReuseRoute = false, maka akan memuat setiap komponen hierarki komponen. Jadi itu berarti setiap komponen orang tua dan anak Anda mulai memuat ulang pada setiap perubahan url. Jadi tidak ada artinya menggunakan kerangka ini.
PSabuwala
28

Sedikit rumit: gunakan jalur yang sama dengan beberapa parameter dummy. Sebagai contoh-

refresh(){
  this.router.navigate(["/same/route/path?refresh=1"]);
}
newari
sumber
12
Sekarang: this.router.navigate(['/pocetna'], { queryParams: { 'refresh': 1 } });dan di route.queryParams.subscribe(val => myRefreshMethod())mana route: ActivatedRoutedisuntikkan dalam komponen segar ... Semoga bisa membantu
insan-e
5
Saat ini di Angular 7 ini tampaknya tidak berfungsi lagi. Adakah yang bisa memastikan, atau apakah saya melakukan sesuatu yang salah? (Saya juga mencoba sedikit variasi insan-e.)
pbarranis
3
Mungkin agak jelek.
Dabbbb.
23

Saya menggunakan yang ini untuk proyek Angular 10:

reloadCurrentRoute() {
    let currentUrl = this.router.url;
    this.router.navigateByUrl('/', {skipLocationChange: true}).then(() => {
        this.router.navigate([currentUrl]);
    });
}

PS: Diuji dan bekerja juga pada "Angular 7, 8, 9"

Andris
sumber
Saya pikir saya akan mengikuti pengalaman saya dengan solusi ini. Bagi saya, sepertinya memuat ulang seluruh komponen yang terkait dengan rute. Dalam situasi saya, router.navigate biasa dengan parameter perutean yang berbeda akan membuat komponen dimuat dan hanya memuat perubahan baru dari ngOnInit (berdasarkan parameter rute). Solusi Anda tampaknya tidak melakukan ini, tampaknya benar-benar memuat ulang seluruh komponen dan kemudian mengubahnya di ngOnInit berdasarkan parameter rute. Bagaimanapun, ini adalah ketidaknyamanan kecil bagi saya dalam situasi saya dan solusi Anda berfungsi untuk kebutuhan saya.
Evan Sevy
20

Ini bekerja untuk saya seperti pesona

this.router.navigateByUrl('/', {skipLocationChange: true}).then(()=>
this.router.navigate([<route>]));
Nitin Kamate
sumber
3
Ini jawaban yang paling sederhana. Saya akan menandai ini sebagai jawaban yang diterima jika saya bisa. Bertentangan dengan jawaban yang diterima, mungkin ada situasi di mana Anda perlu memuat ulang setiap komponen yang digunakan pada halaman dan harus memuat ulang satu per satu setiap komponen, yang mungkin berada di rute yang berbeda, akan berlebihan bahkan melalui layanan.
Andrew Junior Howard
17

Retas reload rute 2-4 sudut

Bagi saya, menggunakan metode ini di dalam komponen root (komponen, yang ada di rute mana pun) berfungsi:

onRefresh() {
  this.router.routeReuseStrategy.shouldReuseRoute = function(){return false;};

  let currentUrl = this.router.url + '?';

  this.router.navigateByUrl(currentUrl)
    .then(() => {
      this.router.navigated = false;
      this.router.navigate([this.router.url]);
    });
  }
indreed
sumber
Hati-hati dengan pendekatan ini, ini akan memengaruhi perilaku router secara global (rute induk akan selalu dimuat ulang saat menavigasi di antara rute turunan).
Seidme
12

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.

 this.router.navigate([], {
    skipLocationChange: true,
    queryParamsHandling: 'merge' //== if you need to keep queryParams
  })

Router forRoot harus memiliki SameUrlNavigation yang disetel ke 'reload'

 RouterModule.forRoot(appRoutes, {
  // ..
  onSameUrlNavigation: 'reload',
  // ..
})

Dan setiap rute Anda harus memiliki runGuardsAndResolvers yang disetel ke 'selalu'

{
    path: '',
    data: {},
    runGuardsAndResolvers: 'always'
},
Wlada
sumber
1
Ini jawaban yang benar. "onSameUrlNavigation" berfungsi sejak Angular 5. Harap beri suara positif untuk memindahkannya ke atas
Yaroslav Yakovlev
Ini tidak berhasil untuk saya. Andris di bawah melakukannya. Meskipun reload Andris tidak sebersih navigasi rute biasa yang sebenarnya. Tampaknya tidak memuat ulang seluruh halaman, tetapi tampaknya memuat ulang seluruh komponen yang terkait dengan rute. Saya hanya perlu komponen anak untuk memuat ulang berdasarkan parameter rute, bukan seluruh komponen yang terkait dengan rute. Bagaimanapun, itu bekerja dengan cukup baik. Hanya berpikir saya akan ikut serta dalam pengalaman saya.
Evan Sevy
1
Masalah saya diselesaikan dengan sedikit kode terakhir. Menyetel runGuardsAndResolvers: 'selalu' memaksa aplikasi untuk menggunakan penjaga, sehingga mengulangi panggilan ke API yang ada di sana. Terima kasih untuk itu @Wlada
Perjalanan dan kode yang sangat menarik tanggal
8

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

/product/: id / details

import { ActivatedRoute, Params, Router } from ‘@angular/router’;

export class ProductDetailsComponent implements OnInit {

constructor(private route: ActivatedRoute, private router: Router) {
    this.route.params.subscribe(params => {
        this.paramsChange(params.id);
    });
}

// Call this method on page change

ngOnInit() {

}

// Call this method on change of the param
paramsChange(id) {

}
karthi
sumber
4

Sejauh yang saya tahu ini tidak dapat dilakukan dengan router di Angular 2. Tapi Anda bisa melakukan:

window.location.href = window.location.href

Untuk memuat ulang tampilan.

Halo Dunia
sumber
3
Ini menyegarkan seluruh aplikasi bukan hanya rute saat ini!
rostamiani
@HelloWorld - Di mana menempatkan logika demikian di sudut 7?
Pra_A
Tidak masalah versi sudut mana - ini hanya kode js biasa
HelloWorld
Letakkan ini di fungsi klik. window.location.href = '/' atau '/ login' yang pernah didefinisikan di dalam app-routing.module.ts. Dalam kasus saya ketika pengguna logout, ia harus kembali ke layar login jadi saat logout saya menghapus semua data auths dan sukses menggunakan window.location.href = '/'. Ini berarti muat ulang halaman loagin dan jalankan kembali semua javascript lagi. Untuk perubahan rute normal, saya tidak akan merekomendasikan ini di mana tidak ada fungsi yang diperlukan.
Ali Exalter
Saya yakin ini dapat menyetel ulang penyimpanan NgRx Anda sepenuhnya - jadi data apa pun yang telah Anda ambil akan hilang.
John Q
3

Bagi saya bekerja dengan hardcoding

this.router.routeReuseStrategy.shouldReuseRoute = function() {
    return false;
    // or
    return true;
};
Vlad
sumber
2
Tidak direkomendasikan! Orang-orang terus memposting ulang solusi ini dengan berbagai cara di seluruh SO ini. Ya, ini dapat memperbaiki masalah Anda segera tetapi Anda akan lupa nanti bahwa Anda menerapkan ini dan Anda akan menghabiskan berjam-jam mencoba mencari tahu mengapa aplikasi Anda mengalami perilaku aneh.
Posting Impatica
Jika Anda harus menggunakan ini, gunakan solusi Ebraheem Alrabee 'dan hanya menerapkannya ke satu rute.
Posting Impatica
3

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:

const routes: Routes = [
  {
    path: 'gesuch',
    loadChildren: './sections/gesuch/gesuch.module#GesuchModule'
  },
  {
    path: 'gesuch-neu',
    loadChildren: './sections/gesuch/gesuch.module#GesuchModule'
  }
];

Dan berikut menu toggelingnya:

<ul class="navigation">
    <li routerLink="/gesuch-neu" *ngIf="'gesuch' === getSection()">Gesuch</li>
    <li routerLink="/gesuch" *ngIf="'gesuch' !== getSection()">Gesuch</li>
</ul>

Semoga membantu :)

Carli Beeli
sumber
Bagaimana jika rute alternatif memiliki parameter dan Anda ingin memuat ulang ketika parameter berubah?
Mukus
3

Sedikit hardcore tapi

this.router.onSameUrlNavigation = 'reload';
this.router.navigateByUrl(this.router.url).then(() => {

    this.router.onSameUrlNavigation = 'ignore';

});
Dzmitry Vasilevsky
sumber
2

Dalam kasus saya:

const navigationExtras: NavigationExtras = {
    queryParams: { 'param': val }
};

this.router.navigate([], navigationExtras);

bekerja dengan benar

Anton Zimm
sumber
2

implementasikan OnInit dan panggil ngOnInit () dalam metode untuk route.navigate ()

Lihat contoh:

export class Component implements OnInit {

  constructor() {   }

  refresh() {
    this.router.navigate(['same-route-here']);
    this.ngOnInit();   }

  ngOnInit () {

  }
Evandro Mendes
sumber
2

Memecahkan skenario serupa dengan menggunakan komponen dummy dan rute untuk reload, yang sebenarnya melakukan a redirect. Ini jelas tidak mencakup semua skenario pengguna tetapi hanya berfungsi untuk skenario saya.

import { Component, OnInit } from '@angular/core';
import { Router, ActivatedRoute } from '@angular/router';
import { Http } from '@angular/http';

@Component({
  selector: 'reload',
  template: `
    <h1>Reloading...</h1>
  `,
})
export class ReloadComponent implements OnInit{
  constructor(private router: Router, private route: ActivatedRoute) {
  }

  ngOnInit() {
    const url = this.route.snapshot.pathFromRoot.pop().url.map(u => u.path).join('/');
    this.router.navigateByUrl(url);
  }
}

Perutean dihubungkan dengan kabel untuk menangkap semua url menggunakan karakter pengganti:

import { RouterModule } from '@angular/router';
import { NgModule } from '@angular/core';
import { LoginViewComponent } from './views/login/login.component';
import { HomeViewComponent } from './views/home/home.component';
import { ReloadComponent } from './views/reload/reload.component';

@NgModule({
  declarations: [ 
    LoginViewComponent, HomeViewComponent, ReloadComponent
  ],
  imports: [
    RouterModule.forRoot([
      { path: 'login', component: LoginViewComponent },
      { path: 'home', component: HomeViewComponent },
      { 
        path: 'reload',
        children: [{
          path: '**',
          component: ReloadComponent 
        }]
      },
      { path: '**', redirectTo: 'login'}
    ])
  ],
  exports: [
    RouterModule,
  ],
  providers: [],

})
export class AppRoutingModule {}

Untuk menggunakan ini, kita hanya perlu menambahkan reload ke url yang ingin kita tuju:

  this.router.navigateByUrl('reload/some/route/again/fresh', {skipLocationChange: true})
sabithpocker
sumber
2

Solusinya adalah dengan melewatkan parameter dummy (yaitu waktu dalam detik), dengan cara ini tautan selalu dimuat ulang:

this.router.navigate(["/url", {myRealData: RealData, dummyData: (new Date).getTime()}])
losciur
sumber
2

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.

  • Anda kemudian dapat menanganinya dengan berlangganan rute
  • Anda dapat menggunakannya dengan kombinasi runGuardsAndResolvers untuk menjalankan ulang resolver

Biarkan router tidak tersentuh

  • Teruskan refresh queryParam dengan stempel waktu saat ini di URL dan berlangganan queryParams di komponen yang dirutekan.
  • Gunakan Event aktif dari router-outlet untuk mendapatkan komponen yang dirutekan.

Saya telah menulis penjelasan yang lebih rinci di bawah https://medium.com/@kevinkreuzer/refresh-current-route-in-angular-512a19d58f6e

Semoga ini membantu.

Trafalgar
sumber
2

Saya menggunakan setTimeoutdan navigationByUrluntuk memecahkan masalah ini ... Dan ini bekerja dengan baik untuk saya.

Itu dialihkan ke URL lain dan sebagai gantinya muncul lagi di URL saat ini ...

 setTimeout(() => {
     this.router.navigateByUrl('/dashboard', {skipLocationChange: false}).then(() =>
           this.router.navigate([route]));
     }, 500)
ajay hariyal
sumber
1

Misalkan rute komponen yang ingin Anda refresh adalah view, gunakan ini:

this.router.routeReuseStrategy.shouldReuseRoute = function (future: ActivatedRouteSnapshot, curr: ActivatedRouteSnapshot) {
  if (future.url.toString() === 'view' && curr.url.toString() === future.url.toString()) {
    return false;
  }
  return (future.routeConfig === curr.routeConfig);
}; 

Anda dapat menambahkan debuggerdi dalam metode untuk mengetahui rute pasti yang akan datang setelah menavigasi ke "departments/:id/employees".

Ebraheem Alrabeea
sumber
1

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 a RELOAD_PLACEHOLDERke konfigurasi router inti. Ini digunakan untuk navigasi sementara dan menghindari memicu rute lain (atau penjaga).

Catatan: Gunakan hanya ReloadRouterjika Anda menginginkan fungsionalitas muat ulang. Gunakan normal Routerjika tidak.

import { Injectable } from '@angular/core';
import { NavigationExtras, Router } from '@angular/router';

@Injectable({
  providedIn: 'root'
})
export class ReloadRouter {
  constructor(public readonly router: Router) {
    router.config.unshift({ path: 'RELOAD_PLACEHOLDER' });
  }

  public navigate(commands: any[], extras?: NavigationExtras): Promise<boolean> {
    return this.router
      .navigateByUrl('/RELOAD_PLACEHOLDER', {skipLocationChange: true})
      .then(() => this.router.navigate(commands, extras));
  }
}
Dan King
sumber
1

Impor Routerdan ActivatedRoutedari@angular/router

import { ActivatedRoute, Router } from '@angular/router';

Menyuntikkan Routerdan ActivatedRoute(jika Anda membutuhkan sesuatu dari URL)

constructor(
    private router: Router,
    private route: ActivatedRoute,
) {}

Dapatkan parameter apa pun jika diperlukan dari URL.

const appointmentId = this.route.snapshot.paramMap.get('appointmentIdentifier');

Menggunakan trik dengan menavigasi ke dummy atau url utama kemudian ke url sebenarnya akan menyegarkan komponen.

this.router.navigateByUrl('/appointments', { skipLocationChange: true }).then(() => {
    this.router.navigate([`appointment/${appointmentId}`])
});

Dalam kasus Anda

const id= this.route.snapshot.paramMap.get('id');
this.router.navigateByUrl('/departments', { skipLocationChange: true }).then(() => {
    this.router.navigate([`departments/${id}/employees`]);
});

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.

Aamer Shahzad
sumber
0

berlangganan perubahan parameter rute

    // parent param listener ie: "/:id"
    this.route.params.subscribe(params => {
        // do something on parent param change
        let parent_id = params['id']; // set slug
    });

    // child param listener ie: "/:id/:id"
    this.route.firstChild.params.subscribe(params => {
        // do something on child param change
        let child_id = params['id'];
    });
Omar
sumber
0

Jika Anda mengubah rute melalui Tautan Router Ikuti ini:

  constructor(public routerNavigate: Router){

         this.router.routeReuseStrategy.shouldReuseRoute = function () {
            return false;
          };

          this.router.events.subscribe((evt) => {

            if (evt instanceof NavigationEnd) {

                this.router.navigated = false;
             }
          })
      }
Omkar Joshi
sumber
0

Saya yakin ini telah diselesaikan (secara native) di Angular 6+; memeriksa

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)

   this.router.navigate(['/route'], {
        queryParams: { 'refresh': Date.now() }
    });

Di Komponen yang ingin Anda "segarkan / muat ulang"

// . . . Component Class Body

  $_route$: Subscription;
  constructor (private _route: ActivatedRoute) {}

  ngOnInit() {
    this.$_route$ = this._route.queryParams.subscribe(params => {
      if (params['refresh']) {
         // Do Something
         // Could be calling this.ngOnInit() PS: I Strongly advise against this
      }

    });
  }

  ngOnDestroy() {
    // Always unsubscribe to prevent memory leak and unexpected behavior
    this.$_route$.unsubscribe();
  }

// . . . End of Component Class Body
mbao01
sumber
Menariknya, pendekatan ini hanya akan bekerja sekali - sepertinya ada bug di Angular di mana queryParamsMapsubjek hanya diperbarui pertama kali, tetapi tidak pada pembaruan berikutnya.
Andrew Gray
0

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;
    }
});
mohit sharma
sumber
0

Saya telah mencoba beberapa perbaikan dan tidak ada yang berhasil. Versi saya sederhana: tambahkan parameter baru yang tidak digunakan ke dalam parameter kueri

            if (force) {
                let key = 'time';

                while (key in filter) {
                    key = '_' + key;
                }

                filter[key] = Date.now();
            }

            this.router.navigate(['.', { filter: JSON.stringify(filter) }]);
tom10271
sumber
0

window.location.replace

// gunakan backtick untuk menyertakan rute

window.location.replace ( departments/${this.id}/employees)

7guyo
sumber
-1

Kode di bawah ini akan berfungsi:

logoFn(url: any) {

    this.router.routeReuseStrategy.shouldReuseRoute = function () {
        return false;
    };
    this.router.navigate(['']); or
    this.router.navigate([url]);

}
Martin Jesu
sumber