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?
Antworten:
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.
quelle
Dies kann jetzt in Angular 5.1 mithilfe der
onSameUrlNavigation
Eigenschaft 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
onSameUrlNavigation
Option 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.Stellen Sie in Ihren Routendefinitionen
runGuardsAndResolvers
auf einalways
. Dadurch wird der Router angewiesen, die Schutz- und Auflösungszyklen immer zu starten und damit verbundene Ereignisse auszulösen.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.
Wenn alle diese Schritte ausgeführt wurden, sollte das erneute Laden der Route aktiviert sein.
quelle
init
Funktioninit
?Erstellen Sie im Controller eine Funktion, die wie folgt zur erwarteten Route umleitet
dann benutze es so
Diese Funktion leitet zu einer Dummy-Route um und kehrt schnell zur Zielroute zurück, ohne dass der Benutzer dies bemerkt.
quelle
'/'
anstelle von'/DummyComponent'
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:
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 diecomponent
und Daten neu.Link zur ursprünglichen GitHub-Funktionsanforderung
Das Guthaben geht an mihaicux2 auf GitHub.
Ich habe dies auf Version
4.0.0-rc.3
mit getestetimport { Router, NavigationEnd } from '@angular/router';
quelle
Etwas knifflig: Verwenden Sie denselben Pfad mit einigen Dummy-Parametern. Beispielsweise-
quelle
this.router.navigate(['/pocetna'], { queryParams: { 'refresh': 1 } });
undroute.queryParams.subscribe(val => myRefreshMethod())
woroute: ActivatedRoute
wird in aktualisierte Komponente injiziert ... Hoffe, es hilftIch benutze dieses für Angular 9-Projekt:
PS: Getestet und funktioniert auch bei "Angular 7, 8"
quelle
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):
quelle
Das funktioniert bei mir wie ein Zauber
quelle
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
quelle
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.
Für Router forRoot muss SameUrlNavigation auf "neu laden" eingestellt sein.
Und für jede Route muss runGuardsAndResolvers auf "immer" eingestellt sein.
quelle
Für mich arbeitet Hardcoding mit
quelle
Soweit ich weiß, ist dies mit dem Router in Angular 2 nicht möglich. Sie können jedoch einfach Folgendes tun:
So laden Sie die Ansicht neu.
quelle
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:
Und hier das Umschaltmenü:
Ich hoffe es hilft :)
quelle
Ein bisschen Hardcore aber
quelle
In meinem Fall:
richtig arbeiten
quelle
Implementieren Sie OnInit und rufen Sie ngOnInit () in der Methode für route.navigate () auf.
Siehe ein Beispiel:
quelle
Ein ähnliches Szenario wurde mithilfe einer Dummy-Komponente und einer Route für gelöst
reload
, die tatsächlich a ausführtredirect
. Dies deckt definitiv nicht alle Benutzerszenarien ab, sondern hat nur für mein Szenario funktioniert.Das Routing ist so verdrahtet, dass alle URLs mithilfe eines Platzhalters abgefangen werden:
Um dies zu verwenden, müssen wir nur der URL, zu der wir gehen möchten, Reload hinzufügen:
quelle
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.
Lassen Sie den Router unberührt
Ich habe eine ausführlichere Erklärung unter https://medium.com/@kevinkreuzer/refresh-current-route-in-angular-512a19d58f6e geschrieben
Hoffe das hilft.
quelle
Angenommen, die Route der Komponente, die Sie aktualisieren möchten, lautet
view
: Verwenden Sie Folgendes :Sie können
debugger
der Methode ein internes hinzufügen , um zu wissen, welche Route nach dem Navigieren genau angezeigt wird"departments/:id/employees"
.quelle
Eine Lösung besteht darin, einen Dummy-Parameter (dh die Zeit in Sekunden) zu übergeben. Auf diese Weise wird der Link immer neu geladen:
quelle
Ich benutze
setTimeout
undnavigationByUrl
um 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 ...
quelle
Ich glaube, dies wurde (nativ) in Angular 6+ gelöst; prüfen
hier https://github.com/angular/angular/issues/13831 &&
und hier https://medium.com/engineering-on-the-incline/reloading-current-route-on-click-angular-5-1a1bfc740ab2
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)
In der Komponente, die Sie "aktualisieren / neu laden" möchten
quelle
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 undRELOAD_PLACEHOLDER
der 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
ReloadRouter
Sie die Funktion nur in diesen Fällen, wenn Sie die Neuladefunktion verwenden möchten . Verwenden SieRouter
sonst das normale .quelle
Importieren
Router
undActivatedRoute
von@angular/router
Injizieren
Router
undActivatedRoute
(falls Sie etwas von der URL benötigen)Rufen Sie bei Bedarf einen beliebigen Parameter von der URL ab.
Wenn Sie einen Trick verwenden, indem Sie zu einer Dummy- oder Haupt-URL und dann zur tatsächlichen URL navigieren, wird die Komponente aktualisiert.
In deinem Fall
Wenn Sie eine Dummy-Route verwenden, blinkt der Titel "Nicht gefunden", wenn Sie eine nicht gefundene URL implementiert haben, falls keine URL übereinstimmt.
quelle
Änderungen an Routenparametern abonnieren
quelle
Wenn Sie die Route über Router Link ändern, gehen Sie wie folgt vor:
quelle
Sie sollten die Eigenschaft "onSameUrlNavigation" in RouterModule verwenden und dann die Routenereignisse https://blog.angularindepth.com/refresh-current-route-in-angular-512a19d58f6e abonnieren
quelle
Legt fest, wann die Route gespeichert werden soll, und gibt false zurück
und setzen Sie den navigierten Wert des Routers auf false, um anzuzeigen, dass diese Route nie geroutet wurde
quelle
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
quelle
window.location.replace
// benutze Backtick um die Route einzuschließen
window.location.replace (
departments/${this.id}/employees
)quelle