Speichern und zugreifen auf Werte, die weltweit in mehrere Komponenten, im Winkel 2
Habe ich eine Seite mit den Einstellungen, wo Benutzer können sparen Sie einige config-Variablen, wie z.B. ein Benutzername. Der Benutzer kann auch ändern Sie den Benutzernamen auf dieser Seite. Aber wenn ich auf eine andere Komponente (Seite) und zurück, die Benutzernamen nicht gespeichert.
Ich möchte auch zeigen, den Benutzernamen in den anderen Komponenten. Wie mache ich das? Mit einer globalen Variablen?
Struktur:
- App
- app.ts (main)
- Einstellung.ts
- someOtherComponent.ts
InformationsquelleAutor der Frage | 2016-01-03
Du musst angemeldet sein, um einen Kommentar abzugeben.
Was Sie brauchen, ist ein service behalten Sie den Zustand Ihrer Variablen. Sie wären dann in der Lage zu injizieren, der service in jeder Komponente zu setzen oder zu bekommen, dass eine variable.
Hier ist ein Beispiel (/services/my.service.ts):
Würden Sie wahrscheinlich wollen zu setzen, dass der service in der Anbieter-array der app-bootstrap-Funktion (die möglicherweise in Ihre Haupt-app-Komponente-Datei oder in eine separate Datei je nachdem, wie Sie möchten, um Dinge zu tun).
In Ihre Haupt-app-Datei (/app.ts):
Brauchen Sie nicht zu haben COMMON_DIRECTIVES und die anderen alle Kappen der Elemente im array, aber diese sind im Allgemeinen einfach zu machen, so dass Sie nicht haben, konfigurieren Sie in jeder Komponente, die Sie schreiben.
Dann würden Sie den Zugriff auf den service innerhalb einer Komponente wie folgt (/components/einige-Komponente.ts):
Vielleicht möchten Sie auch hinzufügen, um den service so, dass es gespeichert wird der Wert irgendwo (semi -) permanent, so dass es erreicht werden konnte, das nächste mal der Benutzer in die Anwendung.
InformationsquelleAutor der Antwort Michael Oryl
Könnte dies ein overkill in Ihrer aktuellen situation, aber wenn Sie gehen, um zu wachsen, Ihre Anwendung in ein größeres, dies könnte sparen Sie eine Menge ärger auf der ganzen Linie. Das heißt, ich glaube, Eckig mit Redux-wie store ist eine wirklich starke Kombination. Mein Vorschlag ist, verwenden Sie
ngrx/store
Modul.Quelle:
ngrx/store
GitHub repoDen code unten sollte Umriss alle Schritte, die Sie Folgen müssen, um die Integration der
ngrx/store
in Ihre Anwendung. Um der Kürze Willen habe ich darauf verzichtet alle vorhandenen code, den Sie haben könnte, und alle Einfuhren, die Sie benötigen, hinzufügen.Installieren Sie das Modul
Erstellen Sie einen Druckminderer
Importieren Sie die StoreModule
Erstellung einer Schnittstelle für die Einstellungen Reducer
Erstellen Sie eine Speicher-Schnittstelle
Erstellen Einstellungen Service
Einstellungen Component-Controller
Einstellungen-Component-Template
Mit dem setup oben beschrieben können Sie dann injizieren Sie die
SettingsService
in jeder Komponente und zeigt den Wert in der Vorlage.Die gleiche Weise können Sie auch aktualisieren Sie den Wert der
store
von jeder Komponente durch die Verwendung vonthis.settingsService.update({ ... });
und die Veränderung wird sich auf alle Orte, die mit diesem Wert - sei es eine Komponente, die über eineasync
Rohr oder einen anderen Dienst über.subscribe()
.InformationsquelleAutor der Antwort Vladimir Zdenek
Würden Sie brauchen eine service-so können Sie Spritzen, wo immer Sie es brauchen.:
Können Sie diesen service in alle Module, aber es ist eine chance, die Sie erhalten mehrere Instanzen. Daher stellen wir den Dienst ein singleton.
Sollten Sie rufen die
forRoot
Methode nur in IhremAppModule
:InformationsquelleAutor der Antwort Robin Dijkhof
Vladimir richtig erwähnt, über
ngrx
.Ich würde einen Dienst nutzen, mit
Subject
/BehaviourSubject
undObservable
zuset
undget
den Zustand (Werte), die ich brauche.Diskutierten wir hier Die Kommunikation zwischen mehreren Komponenten mit einem Dienst über Beobachtbare und Unterliegen im Winkel 2 wie können Sie die gleichen Werte in mehrere Komponenten, die nicht
parent
-child
oderchild
-parent
Beziehung und ohne das importieren von externen Bibliothek alsngrx
speichern.InformationsquelleAutor der Antwort DrNio
Ich habe das gleiche problem, die meisten die Komponente muss loggedInUser Informationen.
Für zB : Benutzernamen, Ihre bevorzugte Sprache, bevorzugte Zeitzone des Benutzers usw.
Also, für dieses, sobald der user sich anmeldet, können wir Folgendes tun :
Wenn alle Informationen in JWT Token oder /me RESTful Api, dann können Sie entschlüsseln des Tokens in einem der service.
zB: user.service.ts
hält drei öffentliche Verhalten unterliegt, wer hört auf diese variable bekommt den Wert, wenn es sich ändern. Bitte überprüfen Sie die rxjs Programmierstil.
und jetzt, wo diese variable benötigt werden, einfach abonnieren von dieser Komponente.
ZB: NavComponent wird auf jeden Fall benötigt Benutzernamen. daher der code wird wie unter:
Daher reaktive Programmierung gibt eine bessere Lösung zu behandeln, die Abhängigkeit variable.
Den oben löst auch das problem, wenn die Seite schwer zu regenerieren, wie ich das speichern der Werte im localstorage-und Holen es im Konstruktor.
Bitte beachten Sie : Es wird davon ausgegangen, dass der Benutzer eingeloggt ist, die Daten kommen von JWT token, können wir auch den gleichen service(UserHttpService), wenn die Daten aus Restful Api. Eg: api/me
InformationsquelleAutor der Antwort virsha