In einer der Vorlagen meiner Angular 2-Routen ( FirstComponent ) habe ich eine Schaltfläche
first.component.html
<div class="button" click="routeWithData()">Pass data and route</div>
Mein Ziel ist es zu erreichen:
Klicken Sie auf die Schaltfläche -> Route zu einer anderen Komponente, während Sie die Daten beibehalten und die andere Komponente nicht als Direktive verwenden.
Das habe ich versucht ...
1. ANSATZ
In derselben Ansicht speichere ich das Sammeln derselben Daten basierend auf Benutzerinteraktion.
first.component.ts
export class FirstComponent {
constructor(private _router: Router) { }
property1: number;
property2: string;
property3: TypeXY; // this a class, not a primitive type
// here some class methods set the properties above
// DOM events
routeWithData(){
// here route
}
}
Normalerweise würde ich den Weg nach SecondComponent durch
this._router.navigate(['SecondComponent']);
eventuell die Daten weitergeben
this._router.navigate(['SecondComponent', {p1: this.property1, p2: property2 }]);
Die Definition der Verknüpfung mit Parametern wäre
@RouteConfig([
// ...
{ path: '/SecondComponent/:p1:p2', name: 'SecondComponent', component: SecondComponent}
)]
Das Problem bei diesem Ansatz ist, dass ich vermutlich keine komplexen Daten (z. B. ein Objekt wie property3) in der URL übergeben kann.
2. ANSATZ
Eine Alternative wäre, SecondComponent als Direktive in FirstComponent aufzunehmen.
<SecondComponent [p3]="property3"></SecondComponent>
Ich möchte jedoch zu dieser Komponente routen und sie nicht einschließen!
3. ANSATZ
Die praktikabelste Lösung, die ich hier sehe, wäre die Verwendung eines Dienstes (z. B. FirstComponentService) für
- Speichern Sie die Daten (_firstComponentService.storeData ()) auf routeWithData () in FirstComponent
- Abrufen der Daten (_firstComponentService.retrieveData ()) in ngOnInit () in SecondComponent
Obwohl dieser Ansatz durchaus praktikabel erscheint, frage ich mich, ob dies der einfachste / eleganteste Weg ist, um das Ziel zu erreichen.
Im Allgemeinen würde ich gerne wissen, ob mir andere mögliche Ansätze fehlen , um die Daten zwischen Komponenten zu übertragen, insbesondere mit der weniger möglichen Menge an Code
quelle
Pass data using Query Parameters
ist das, wonach ich gesucht habe. Ihr Link hat meinen Tag gerettet.state
Überprüfen Sie die PR auf weitere Details. Einige nützliche Informationen hierAntworten:
Update 4.0.0
Weitere Informationen finden Sie in den Angular-Dokumenten unter https://angular.io/guide/router#fetch-data-before-navigating
Original
Die Nutzung eines Dienstes ist der richtige Weg. In Routenparametern sollten Sie nur Daten übergeben, die in der Browser-URL-Leiste angezeigt werden sollen.
Siehe auch https://angular.io/docs/ts/latest/cookbook/component-communication.html#!#bidirectional-service
Der mit RC.4 gelieferte Router wird wieder eingeführt
data
Siehe auch den Plunker unter https://github.com/angular/angular/issues/9757#issuecomment-229847781
quelle
ngOnInit() { this.myVar = this.route.snapshot.data['some_data']; }
NavigationExtras
- stackoverflow.com/a/54879389/1148107Ich denke, da wir in Winkel 2 nicht wie in Winkel 1.x $ rootScope haben . Wir können Angular 2 Shared Service / Class verwenden, während wir in ngOnDestroy Daten an den Service übergeben und nach dem Routing die Daten aus dem Service in der ngOnInit- Funktion übernehmen:
Hier verwende ich DataService, um Heldenobjekte zu teilen:
Objekt von der ersten Seitenkomponente übergeben:
Nehmen Sie das Objekt aus der zweiten Seitenkomponente:
Hier ist ein Beispiel: Plunker
quelle
this.hero = this.dataService.hero
? Bekomme ich die Werte?Nun, der einfachste Weg, dies in Angular 6 oder anderen Versionen zu tun, besteht darin, einfach Ihren Pfad mit der Datenmenge zu definieren, die Sie übergeben möchten
Wie Sie meiner Routendefinition entnehmen können, habe ich
/:id
den Daten, die ich über die Routernavigation an die Komponente übergeben möchte, den Stand hinzugefügt . Daher wird Ihr Code so aussehenUm das
id
auf der Komponente zu lesen , importieren Sie einfachActivatedRoute
wieund auf der
ngOnInit
ist, wo Sie die Daten abrufenSie können mehr in diesem Artikel lesen https://www.tektutorialshub.com/angular-passing-parameters-to-route/
quelle
Angular 7.2.0 führte eine neue Methode zum Übergeben der Daten beim Navigieren zwischen gerouteten Komponenten ein:
Oder:
Um den Status zu lesen, können Sie
window.history.state
nach Abschluss der Navigation auf die Eigenschaft zugreifen :quelle
window.history.state
gibt so etwas wie zurück,{navigationId: 2}
anstatt das Objekt zurückzugeben, das ich übergeben habe.navigationId
ein Wert hinzugefügt. Wenn keine Daten hinzugefügt werden, werden nur dienavigationId
angezeigt. Sehen Sie sich die übergebenen Daten an, gehen Sie zurück oder aktualisieren Sie Ihre App und lösen Sie die Aktion erneut aus, mit der die Daten zur Route hinzugefügt und zur nächsten Route navigiert werden (z. B. Klicken auf die Schaltfläche). Dadurch werden Ihre Daten zum Objekt hinzugefügt.Eine super kluge Person (tmburnell), die nicht ich bin, schlägt vor, die Routendaten neu zu schreiben:
Wie hier in den Kommentaren zu sehen.
Ich hoffe, jemand wird dies nützlich finden
quelle
Ich dies der andere Ansatz nicht gut für dieses Problem. Ich denke, der beste Ansatz ist Query-Parameter by
Router
Angular, die zwei Möglichkeiten haben:Mit diesem Code können Sie in Ihrem HTML-Code zu
url
by navigierenparams
:Sie müssen den Router nach Ihren Wünschen einspeisen
constructor
:Verwenden Sie jetzt Folgendes:
Wenn Sie nun
Router
in einem anderen lesen möchten, müssenComponent
Sie Folgendes verwendenActivatedRoute
:und
subscribe
das:quelle
Es ist 2019 und viele der Antworten hier würden funktionieren, je nachdem, was Sie tun möchten. Wenn Sie einen internen Status übergeben möchten, der in der URL nicht sichtbar ist (Parameter, Abfrage), können Sie ihn
state
seit 7.2 verwenden (wie ich erst heute erfahren habe :)).Aus dem Blog (Credits Tomasz Kula) - Sie navigieren zur Route ....
... von ts:
this.router.navigateByUrl('/details', { state: { hello: 'world' } });
... aus der HTML-Vorlage:
<a routerLink="/details" [state]="{ hello: 'world' }">Go</a>
Und um es in der Zielkomponente aufzunehmen:
Spät, aber ich hoffe, das hilft jemandem mit Angular.
quelle
Lösung mit ActiveRoute (wenn Sie ein Objekt über die Route übergeben möchten, verwenden Sie JSON.stringfy / JSON.parse):
Bereiten Sie das Objekt vor dem Senden vor:
Empfangen Sie Ihr Objekt in der Zielkomponente:
quelle
super.ngOnInit();
?Der dritte Ansatz ist die häufigste Methode, um Daten zwischen Komponenten auszutauschen. Sie können den Item-Service einfügen, den Sie in der zugehörigen Komponente verwenden möchten.
quelle
Übergeben Sie mit JSON
quelle
Verwenden Sie einen gemeinsam genutzten Dienst, um Daten mit einem benutzerdefinierten Index zu speichern. Senden Sie dann diesen benutzerdefinierten Index mit queryParam. Dieser Ansatz ist flexibler .
.
quelle
sag du hast
und Sie möchten Daten an component2.ts übergeben .
in component1.ts ist eine Variable mit Daten sagen
quelle
Mit BehaviorSubject können Sie Daten zwischen gerouteten Komponenten austauschen. Ein BehaviorSubject enthält einen Wert. Wenn es abonniert ist, gibt es den Wert sofort aus. Ein Betreff enthält keinen Wert.
Im Dienste.
In der Komponente können Sie dieses BehaviorSubject abonnieren.
Hinweis: Der Betreff funktioniert hier nicht. Sie müssen nur den Betreff "Verhalten" verwenden.
quelle