So laden Sie die aktuelle Route mit dem Angular 2-Router neu

141

Ich verwende Winkel 2 mit Hash-Standort-Strategie.

Die Komponente wird mit dieser Route geladen:

"departments/:id/employees"

Soweit in Ordnung.

Nachdem ich mehrere bearbeitete Tabellenzeilen erfolgreich im Stapel gespeichert habe, möchte ich die aktuelle Routen-URL über Folgendes neu laden:

this.router.navigate([`departments/${this.id}/employees`]);

Aber nichts passiert, warum?

Pascal
quelle
Schauen Sie sich diese Antwort auf eine ähnliche Frage an: stackoverflow.com/a/44580036/550975
Serj Sagan

Antworten:

46

Wenn Ihr navig (() die URL nicht ändert, die bereits in der Adressleiste Ihres Browsers angezeigt wird, hat der Router nichts zu tun. Es ist nicht die Aufgabe des Routers, die Daten zu aktualisieren. Wenn Sie die Daten aktualisieren möchten, erstellen Sie einen in die Komponente eingefügten Dienst und rufen Sie die Ladefunktion für den Dienst auf. Wenn die neuen Daten abgerufen werden, wird die Ansicht über Bindungen aktualisiert.

Yakov Fain
quelle
2
Jetzt sagst du es, ich muss zustimmen, ABER ... der AngularJS UI Router hatte eine Option zum erneuten Laden, daher ist das Nachladen einer Route eine Meinung ;-) Aber ja, ich könnte einfach Daten für diesen Tipp neu laden, was tatsächlich offensichtlich ist ...
Pascal
83
Ich bin nicht einverstanden, was ist, wenn Sie die Wachen erneut ausführen möchten, sagen Sie, wenn sich jemand abmeldet?
Jackie
1
@Jackie Ich dachte, dass du die Wachen vielleicht noch einmal ausführen könntest ... wenn sie Weiterleitungen eingebaut haben, könnte das den Trick machen.
OldTimeGuitarGuy
11
@ YakovFain sorry, aber das ist falsch. Dies bedeutet, dass Sie jetzt zwei Wahrheitsquellen für das Routenverhalten haben - eine während der Wache, die andere in der Komponente. Sie duplizieren jetzt nicht nur möglicherweise die Logik, sondern widersetzen sich auch einem natürlicheren Datenfluss: 1. Nehmen Sie Änderungen an der API vor, 2. Aktualisieren Sie die Route, um den neuen Datenstatus von der API abzurufen, und machen Sie die API zur Quelle der Wahrheit. Es gibt einfach keinen Grund, Benutzern NICHT die Möglichkeit zu geben, eine Route manuell neu auszulösen, damit der natürliche Datenfluss wieder stattfinden kann.
AgmLauncher
4
Ich denke nicht, dass dies eine gute Antwort ist. Der Router sollte die Quelle der Wahrheit für Ihre Daten sein. Wenn Sie es über einen separaten Dienst neu laden müssen, kennt der Router die neueste Version nicht mehr und Ihre Komponenten können sich nicht mehr auf Ihren Router als Quelle der Wahrheit verlassen.
Dan King
124

Dies kann jetzt in Angular 5.1 mithilfe der onSameUrlNavigationEigenschaft der Routerkonfiguration erfolgen.

Ich habe einen Blog hinzugefügt, der erklärt, wie hier, aber der Kern davon ist wie folgt

https://medium.com/engineering-on-the-incline/reloading-current-route-on-click-angular-5-1a1bfc740ab2

In der onSameUrlNavigationOption zum Aktivieren der Routerkonfiguration setzen Sie diese Option auf 'reload'. Dies führt dazu, dass der Router einen Ereigniszyklus auslöst, wenn Sie versuchen, zu einer bereits aktiven Route zu navigieren.

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

Stellen Sie in Ihren Routendefinitionen runGuardsAndResolversauf ein always. Dadurch wird der Router angewiesen, die Schutz- und Auflösungszyklen immer zu starten und damit verbundene Ereignisse auszulösen.

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

Schließlich müssen Sie in jeder Komponente, die Sie das Neuladen aktivieren möchten, die Ereignisse behandeln. Dies kann durch Importieren des Routers, Binden an die Ereignisse und Aufrufen einer Initialisierungsmethode erfolgen, die den Status Ihrer Komponente zurücksetzt und bei Bedarf Daten erneut abruft.

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

Wenn alle diese Schritte ausgeführt wurden, sollte das erneute Laden der Route aktiviert sein.

Simon McClive
quelle
Gibt es eine Möglichkeit, die Komponente neu zu laden, anstatt eine initFunktion
aufzurufen?
Ich glaube nicht ... es sei denn, Sie navigieren von der Route weg und wieder zurück. Eine Init-Funktion ist nicht das Ende der Welt. Sie können die Initialisierung so steuern, dass sie den gleichen Effekt hat wie das Neuladen der Komponente. Gibt es einen bestimmten Grund, ohne den Sie ein vollständiges Nachladen durchführen möchten init?
Simon McClive
Ich habe eine Lösung für mein Problem gefunden. Vielen Dank für Ihre Antwort und den Blog, der nützlich war.
Ebraheem Alrabee '10.
Wie es in Angular 4 gemacht wird, außer beim erneuten Laden von Fenstern.
Vishakha
Funktioniert hervorragend für meine Angular5-App! Das Abbestellen in ngOnDestroy () ist ein bisschen wichtig - interessant, wenn Sie es nicht tun :-)
BobC
107

Erstellen Sie im Controller eine Funktion, die wie folgt zur erwarteten Route umleitet

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

dann benutze es so

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

Diese Funktion leitet zu einer Dummy-Route um und kehrt schnell zur Zielroute zurück, ohne dass der Benutzer dies bemerkt.

Theo Sharkson
quelle
3
Vielen Dank! Beste Lösung hier.
Alan Smith
Diese Lösung funktioniert gut, wir können sie verwenden, bis wir eine bessere bekommen. Danke @theo.
Sibeesh Venu
12
es funktioniert wie ein Zauber, wenn ich '/'anstelle von'/DummyComponent'
suhailvs
1
Funktioniert gut in Angular 7, ohne Probleme im Browserverlauf. Ich habe mich für diese Lösung entschieden, da sie auf eine bestimmte Komponente ausgerichtet ist. Es scheint mir, dass das erneute Laden derselben Seite im Allgemeinen ein ungewöhnlicher Fall ist. Daher scheint es übertrieben, die gesamte Anwendung einem bestimmten Paradigma zu folgen. Dies ist klein und einfacher zu implementieren als andere Lösungen.
JE Carter II
1
Okay, es funktioniert, aber ... es lädt Ihre HomeComponent neu (oder was auch immer Sie auf der Route "/" haben), durchläuft den gesamten Lebenszyklus von ngOnInit / ngOnDestroy umsonst. Es ist besser, eine bestimmte Route mit einer Dummy- und Leichtbaukomponente zu haben, sonst werden Sie die Verzögerung bemerken
petronius
77

BEARBEITEN

Verwenden Sie für neuere Versionen von Angular (5.1+) die von @Simon McClive vorgeschlagene Antwort

Alte Antwort

Ich habe diese Problemumgehung bei einer GitHub-Funktionsanforderung für Angular gefunden:

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

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

Ich habe versucht, dies zu meiner Funktion app.component.ts hinzuzufügen ngOnInit , und es hat sicher funktioniert. Alle weiteren Klicks auf denselben Link laden jetzt die componentund Daten neu.

Link zur ursprünglichen GitHub-Funktionsanforderung

Das Guthaben geht an mihaicux2 auf GitHub.

Ich habe dies auf Version 4.0.0-rc.3mit getestetimport { Router, NavigationEnd } from '@angular/router';

Arg0n
quelle
1
Habe es gerade in Angular 4.4.x versucht und das funktioniert komplett. Vielen Dank!
Mindsect Team
1
Dies funktionierte hervorragend für mich, bis ich die Navigationsleiste von Material für die Navigation durch die untergeordneten Routen jeder übergeordneten Route in meiner App implementiert habe. Sobald der Benutzer die Seite aufruft, auf der dieser Code ausgeführt wird, verschwindet die animierte Tintenleiste. (Warum? Ich habe nicht genug Zeit oder Raum, um zu erklären ...)
andreisrob
3
Dies ist eine sehr schlechte Idee - Ihre ActivatedRoute ist jetzt immer dieselbe.
Artuska
1
@AnandTyagi Probieren Sie die SimonMcClives-Lösung aus, wenn Sie Angular 5.1+ verwenden. Vielleicht funktioniert das besser für Sie.
Arg0n
2
Sehr schlechte Idee ... Sobald routeReuseStrategy.shouldReuseRoute = false angewendet wurde, wird jede Komponente der Komponentenhierarchie geladen. Das bedeutet, dass jede übergeordnete und untergeordnete Komponente bei URL-Änderungen neu geladen wird. Es hat also keine Bedeutung, dieses Framework zu verwenden.
PSabuwala
27

Etwas knifflig: Verwenden Sie denselben Pfad mit einigen Dummy-Parametern. Beispielsweise-

refresh(){
  this.router.navigate(["/same/route/path?refresh=1"]);
}
Newari
quelle
12
Jetzt: this.router.navigate(['/pocetna'], { queryParams: { 'refresh': 1 } });und route.queryParams.subscribe(val => myRefreshMethod())wo route: ActivatedRoutewird in aktualisierte Komponente injiziert ... Hoffe, es hilft
Wahnsinn
4
Derzeit scheint dies in Angular 7 nicht mehr zu funktionieren. Kann jemand bestätigen, oder mache ich etwas falsch? (Ich habe auch die leichte Variation von Insan-e ausprobiert.)
Pbarranis
2
Ein bisschen hässlich vielleicht.
Dabbbb.
18

Ich benutze dieses für Angular 9-Projekt:

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

PS: Getestet und funktioniert auch bei "Angular 7, 8"

Andris
quelle
Ich dachte, ich würde meine Erfahrungen mit dieser Lösung einfließen lassen. Für mich scheint es die gesamte mit der Route verknüpfte Komponente neu zu laden. In meiner Situation hält eine reguläre router.navigate mit verschiedenen Routing-Parametern die Komponente geladen und lädt nur die neuen Änderungen von ngOnInit (basierend auf den Routenparametern). Ihre Lösung scheint dies nicht zu tun, sie scheint tatsächlich die gesamte Komponente neu zu laden und dann ihre Änderungen in ngOnInit basierend auf den Routenparametern vorzunehmen. Wie auch immer, es ist eine kleine Unannehmlichkeit für mich in meiner Situation und Ihre Lösung funktioniert für meine Bedürfnisse.
Evan Sevy
17

Angular 2-4 Route Reload Hack

Für mich funktioniert die Verwendung dieser Methode in einer Root-Komponente (Komponente, die auf einer beliebigen Route vorhanden ist):

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
quelle
Seien Sie bei diesem Ansatz vorsichtig, da dies das Verhalten des Routers global beeinflusst (die übergeordnete Route wird beim Navigieren zwischen untergeordneten Routen immer neu geladen).
30.
16

Das funktioniert bei mir wie ein Zauber

this.router.navigateByUrl('/', {skipLocationChange: true}).then(()=>
this.router.navigate([<route>]));
Nitin Kamate
quelle
3
Dies ist die einfachste Antwort. Ich würde dies als akzeptierte Antwort markieren, wenn ich könnte. Im Gegensatz zur akzeptierten Antwort kann es Situationen geben, in denen Sie jede einzelne Komponente, die auf einer Seite verwendet wird, neu laden müssen und jede einzelne Komponente, die sich möglicherweise auf unterschiedlichen Routen befindet, einzeln neu laden müssen, was selbst über einen Dienst zu viel des Guten wäre.
Andrew Junior Howard
8

Beim erneuten Laden der Parameter wird keine Seite neu geladen. Das ist wirklich eine gute Funktion. Die Seite muss nicht neu geladen werden, aber wir sollten den Wert der Komponente ändern. Die paramChange-Methode ruft die URL-Änderung auf. So können wir die Komponentendaten aktualisieren

/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
quelle
7

Das habe ich mit Angular 9 gemacht . Ich bin nicht sicher, ob dies in älteren Versionen funktioniert.

Sie müssen dies aufrufen, wenn Sie neu laden müssen.

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

Für Router forRoot muss SameUrlNavigation auf "neu laden" eingestellt sein.

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

Und für jede Route muss runGuardsAndResolvers auf "immer" eingestellt sein.

{
    path: '',
    data: {},
    runGuardsAndResolvers: 'always'
},
Wlada
quelle
1
Dies ist die richtige Antwort. "onSameUrlNavigation" funktioniert seit Angular 5. Bitte stimmen Sie zu, um es nach oben zu verschieben
Yaroslav Yakovlev
Das hat bei mir nicht funktioniert. Andris ist unten. Obwohl Andris 'Nachladen nicht so "sauber" ist wie eine normale Routennavigation. Es scheint nicht die gesamte Seite neu zu laden, aber es scheint die gesamte mit der Route verknüpfte Komponente neu zu laden. Ich brauchte nur untergeordnete Komponenten zum Neuladen basierend auf Routenparametern, nicht die gesamte Komponente, die der Route zugeordnet ist. Jedenfalls funktioniert es gut genug. Ich dachte nur, ich würde mich auf meine Erfahrung einlassen.
Evan Sevy
4

Für mich arbeitet Hardcoding mit

this.router.routeReuseStrategy.shouldReuseRoute = function() {
    return false;
    // or
    return true;
};
Vlad
quelle
1
Nicht empfohlen! Die Leute veröffentlichen diese Lösung in diesem SO immer wieder auf unterschiedliche Weise. Ja, es kann Ihr sofortiges Problem beheben, aber Sie werden später vergessen, dass Sie dies implementiert haben, und Sie werden Stunden damit verbringen, herauszufinden, warum Ihre App ein seltsames Verhalten aufweist.
Helzgate
Wenn Sie diese Lösung verwenden müssen, verwenden Sie die Lösung von Ebraheem Alrabee und wenden Sie sie nur auf eine einzelne Route an.
Helzgate
4

Soweit ich weiß, ist dies mit dem Router in Angular 2 nicht möglich. Sie können jedoch einfach Folgendes tun:

window.location.href = window.location.href

So laden Sie die Ansicht neu.

Hallo Welt
quelle
3
Dies aktualisiert die gesamte Anwendung, nicht nur die aktuelle Route!
Rostamiani
@HelloWorld - Wo soll man also Logik in Winkel 7 setzen?
Pra_A
Es ist egal, welche abgewinkelte Ausführung - das ist nur regelmäßig js Code
Hello World
Setzen Sie diese auf Klickfunktion. window.location.href = '/' oder '/ login', die in app-routing.module.ts definiert sind. In meinem Fall sollte der Benutzer beim Abmelden zum Anmeldebildschirm zurückkehren, damit ich beim Abmelden alle Authentifizierungsdaten lösche und bei Erfolg window.location.href = '/' verwende. Dies bedeutet, dass Sie die Loagin-Seite neu laden und das gesamte Javascript erneut ausführen müssen. Für eine normale Änderung der Route werde ich dies nicht empfehlen, wenn keine erneute Ausführung von Funktionen erforderlich ist.
Ali Exalter
Ich glaube, dies kann Ihren NgRx-Speicher vollständig zurücksetzen, sodass alle Daten, die Sie bereits abgerufen haben, verloren gehen.
John Q
3

Wir haben eine schnelle und unkomplizierte Lösung gefunden, bei der Sie nicht am Innenleben von Angular basteln müssen:

Grundsätzlich gilt: Erstellen Sie einfach eine alternative Route mit demselben Zielmodul und wechseln Sie einfach zwischen diesen:

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

Und hier das Umschaltmenü:

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

Ich hoffe es hilft :)

Carli Beeli
quelle
Was ist, wenn die alternative Route Parameter enthält und Sie sie neu laden möchten, wenn sich der Parameter ändert?
Mukus
3

Ein bisschen Hardcore aber

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

    this.router.onSameUrlNavigation = 'ignore';

});
Dzmitry Vasilevsky
quelle
2

In meinem Fall:

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

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

richtig arbeiten

Anton Zimm
quelle
2

Implementieren Sie OnInit und rufen Sie ngOnInit () in der Methode für route.navigate () auf.

Siehe ein Beispiel:

export class Component implements OnInit {

  constructor() {   }

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

  ngOnInit () {

  }
Evandro Mendes
quelle
2

Ein ähnliches Szenario wurde mithilfe einer Dummy-Komponente und einer Route für gelöst reload, die tatsächlich a ausführt redirect. Dies deckt definitiv nicht alle Benutzerszenarien ab, sondern hat nur für mein Szenario funktioniert.

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

Das Routing ist so verdrahtet, dass alle URLs mithilfe eines Platzhalters abgefangen werden:

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

Um dies zu verwenden, müssen wir nur der URL, zu der wir gehen möchten, Reload hinzufügen:

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

Es gibt verschiedene Ansätze, um die aktuelle Route zu aktualisieren

Ändern des Routerverhaltens (seit Angular 5.1) Setzen Sie die Router onSameUrlNavigation auf 'reload'. Dadurch werden die Router-Ereignisse auf derselben URL-Navigation ausgegeben.

  • Sie können sie dann bearbeiten, indem Sie eine Route abonnieren
  • Sie können es mit der Kombination von runGuardsAndResolvers verwenden, um Resolver erneut auszuführen

Lassen Sie den Router unberührt

  • Übergeben Sie eine Aktualisierung queryParam mit dem aktuellen Zeitstempel in der URL und abonnieren Sie queryParams in Ihrer gerouteten Komponente.
  • Verwenden Sie das Aktivierungsereignis des Router-Outlets, um die geroutete Komponente zu erfassen.

Ich habe eine ausführlichere Erklärung unter https://medium.com/@kevinkreuzer/refresh-current-route-in-angular-512a19d58f6e geschrieben

Hoffe das hilft.

Trafalgar
quelle
1

Angenommen, die Route der Komponente, die Sie aktualisieren möchten, lautet view: Verwenden Sie Folgendes :

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

Sie können debuggerder Methode ein internes hinzufügen , um zu wissen, welche Route nach dem Navigieren genau angezeigt wird "departments/:id/employees".

Ebraheem Alrabee '
quelle
1

Eine Lösung besteht darin, einen Dummy-Parameter (dh die Zeit in Sekunden) zu übergeben. Auf diese Weise wird der Link immer neu geladen:

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

Ich benutze setTimeoutund navigationByUrlum dieses Problem zu lösen ... Und es funktioniert gut für mich.

Es wird zu einer anderen URL umgeleitet und kommt stattdessen wieder in der aktuellen URL ...

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

Ich glaube, dies wurde (nativ) in Angular 6+ gelöst; prüfen

Dies funktioniert jedoch für eine gesamte Route (einschließlich aller Kinderrouten).

Wenn Sie auf eine einzelne Komponente abzielen möchten, gehen Sie wie folgt vor: Verwenden Sie einen Abfrageparameter, der sich ändert, damit Sie so oft navigieren können, wie Sie möchten.

Am Punkt der Navigation (Klasse)

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

In der Komponente, die Sie "aktualisieren / neu laden" möchten

// . . . 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
quelle
1

Sehr frustrierend, dass Angular immer noch keine gute Lösung dafür zu bieten scheint. Ich habe hier ein Github-Problem angesprochen: https://github.com/angular/angular/issues/31843

In der Zwischenzeit ist dies meine Problemumgehung. Es baut auf einigen der anderen oben vorgeschlagenen Lösungen auf, aber ich denke, es ist etwas robuster. Dabei wird der Router-Dienst in ein " ReloadRouter" eingeschlossen, das sich um die Neuladefunktion kümmert und RELOAD_PLACEHOLDERder Core-Router-Konfiguration eine hinzufügt . Dies wird für die Zwischennavigation verwendet und verhindert, dass andere Routen (oder Wachen) ausgelöst werden.

Hinweis: Verwenden ReloadRouterSie die Funktion nur in diesen Fällen, wenn Sie die Neuladefunktion verwenden möchten . Verwenden Sie Routersonst das normale .

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
quelle
1

Importieren Routerund ActivatedRoutevon@angular/router

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

Injizieren Routerund ActivatedRoute(falls Sie etwas von der URL benötigen)

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

Rufen Sie bei Bedarf einen beliebigen Parameter von der URL ab.

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

Wenn Sie einen Trick verwenden, indem Sie zu einer Dummy- oder Haupt-URL und dann zur tatsächlichen URL navigieren, wird die Komponente aktualisiert.

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

In deinem Fall

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

Wenn Sie eine Dummy-Route verwenden, blinkt der Titel "Nicht gefunden", wenn Sie eine nicht gefundene URL implementiert haben, falls keine URL übereinstimmt.

Aamer Shahzad
quelle
0

Änderungen an Routenparametern abonnieren

    // 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
quelle
0

Wenn Sie die Route über Router Link ändern, gehen Sie wie folgt vor:

  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
quelle
0

Sie sollten die Eigenschaft "onSameUrlNavigation" in RouterModule verwenden und dann die Routenereignisse https://blog.angularindepth.com/refresh-current-route-in-angular-512a19d58f6e abonnieren

Dasha Lazovskaya
quelle
Ein Link zu einer Lösung ist willkommen, aber stellen Sie sicher, dass Ihre Antwort ohne sie nützlich ist: Fügen Sie dem Link einen Kontext hinzu, damit Ihre Mitbenutzer eine Vorstellung davon haben, was es ist und warum es dort ist, und zitieren Sie dann den relevantesten Teil der Seite, die Sie verwenden. erneutes Verknüpfen mit, falls die Zielseite nicht verfügbar ist. Antworten, die kaum mehr als ein Link sind, können gelöscht werden.
Alessio
0

Legt fest, wann die Route gespeichert werden soll, und gibt false zurück

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

und setzen Sie den navigierten Wert des Routers auf false, um anzuzeigen, dass diese Route nie geroutet wurde

this.mySubscription = this.router.events.subscribe(event => {
    if (event instanceof NavigationEnd) {
        this.router.navigated = false;
    }
});
Mohit Sharma
quelle
0

Ich habe ein paar Korrekturen versucht und keine davon funktioniert. Meine Version ist einfach: Fügen Sie einen neuen nicht verwendeten Parameter zu den Abfrageparametern hinzu

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

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

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

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

window.location.replace

// benutze Backtick um die Route einzuschließen

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

7guyo
quelle