In Angular 1.xx fragen Sie einfach nach demselben Dienst und erhalten dieselbe Instanz, sodass Sie die Daten im Dienst gemeinsam nutzen können.
Jetzt in Angular 2 habe ich eine Komponente, die einen Verweis auf meinen Dienst enthält. Ich kann die Daten im Dienst lesen und ändern, was gut ist. Wenn ich versuche, denselben Dienst in eine andere Komponente einzufügen, scheint es, als würde ich eine neue Instanz erhalten.
Was mache ich falsch? Ist das Muster selbst falsch (Verwenden eines Dienstes zum Teilen von Daten) oder muss ich den Dienst als Singleton (innerhalb einer Instanz der App) oder so markieren?
Ich bin 2.0.0-alpha.27/
übrigens auf
Ich füge einen Service durch appInjector
(edit: now providers
) in die @Component
Annotation ein und speichere dann eine Referenz im Konstruktor. Es funktioniert lokal in der Komponente - nur nicht komponentenübergreifend (sie teilen nicht dieselbe Dienstinstanz), wie ich es mir vorgestellt habe.
UPDATE : Ab Angular 2.0.0 haben wir jetzt @ngModule, wo Sie den Service unter der providers
Eigenschaft auf besagten definieren würden @ngModule
. Dadurch wird sichergestellt, dass dieselbe Instanz dieses Dienstes an jede Komponente, jeden Dienst usw. in diesem Modul übergeben wird.
https://angular.io/docs/ts/latest/guide/ngmodule.html#providers
UPDATE : Angular- und FE-Entwicklung im Allgemeinen ist viel passiert. Wie @noririco erwähnt hat, können Sie auch ein Statusverwaltungssystem wie NgRx verwenden: https://ngrx.io/
quelle
Antworten:
Ein Service-Singleton ist eine gute Lösung. Anderer Weg -
data/events bindings
.Hier ist ein Beispiel für beides:
Live ansehen
quelle
viewInjector
.providers: [MyService]
. Durch das Entfernen der Anbieter wurde es die einzige Instanz der AppDer Kommentar von @maufarinelli verdient eine eigene Antwort, denn bis ich ihn sah, schlug ich mit diesem Problem immer noch meinen Kopf gegen die Wand, selbst mit der Antwort von @Alexander Ermolov.
Das Problem ist, dass, wenn Sie ein
providers
zu Ihrem hinzufügencomponent
:Dies führt dazu, dass eine neue Instanz Ihres Dienstes injiziert wird ... anstatt ein Singleton zu sein .
Entfernen Sie also alle Instanzen Ihrer
providers: [MyService]
in Ihrer Anwendung außer in dermodule
, und es wird funktionieren!quelle
Sie müssen die Ein- und Ausgänge eines @ Component-Dekorators verwenden. Hier ist das grundlegendste Beispiel für die Verwendung von beiden.
quelle
ngFor
,In der übergeordneten Komponentenvorlage:
In der untergeordneten Komponente:
quelle
Es gibt viele Wege. Dies ist ein Beispiel für die Weitergabe zwischen übergeordneten und untergeordneten Elementen. Das ist sehr effizient.
Ich habe ein Beispiel eingereicht, mit dem die Verwendung der Datenbindung auf zwei Arten in zwei Formularen angezeigt werden kann. Wenn jemand eine Plunkr-Probe zur Verfügung stellen kann, wäre das sehr schön ;-)
Möglicherweise suchen Sie mit einem Dienstanbieter nach einem anderen Weg. Sie können sich auch dieses Video als Referenz ansehen: ( Daten zwischen Komponenten in Angular austauschen )
mymodel.ts (Daten zum Teilen)
Denken Sie daran: Es muss ein übergeordnetes Element vorhanden sein, das "mein Modell" für untergeordnete Komponenten freigibt.
Übergeordnete Komponente
Untergeordnete Komponente, mychild.component.ts
Hinweis: In einigen seltenen Fällen kann es zu Fehlern kommen, wenn der HTML-Code analysiert wird, da das Modell bei der Initialisierung der Seite nicht "bereit" ist. Stellen Sie in diesem Fall dem HTML-Code eine ngIf-Bedingung voran:
quelle
Es kommt darauf an, ob es einen einfachen Fall gibt
a) A -> B -> C A hat zwei untergeordnete B und C und wenn Sie Daten zwischen A und B oder A und C teilen möchten, verwenden Sie (Eingabe / Ausgabe)
Wenn Sie zwischen B und C teilen möchten, können Sie auch (Eingabe / Ausgabe) verwenden, es wird jedoch empfohlen, Service zu verwenden.
b) Wenn der Baum groß und komplex ist. (Wenn es so viele Ebenen von Eltern- und Kinderverbindungen gibt.) Und in diesem Fall, wenn Sie Daten gemeinsam nutzen möchten, würde ich ngrx vorschlagen
Es implementiert die Flussarchitektur, die einen clientseitigen Speicher erstellt, den jede Komponente abonnieren und aktualisieren kann, ohne eine Race-Bedingung zu erstellen.
quelle