Ich habe das mehrfach in meiner App gemacht. Es ist einfach, es sollte funktionieren ... Aber dieses Mal nicht.
Mein Problem:
Ich rufe eine Methode in einem Dienst von einer Komponente A auf, meine Komponente B ist abonniert, reagiert aber nicht und empfängt auch nichts. subscribe()
löst nicht aus!
navigation-elements.service.ts
%Vor% IboDetailsGeneral
Komponente
Diese Komponente löst die Methode des Dienstes aus: updateIBOsNavigation
.
IBOsNavigationElement
Komponente
Diese Komponente ist abonniert, sie sollte die Daten auflisten und empfangen ...
Lasst uns DI sortieren:
Berücksichtigen Sie, dass sich IboDetailsGeneral
in einer niedrigeren Ebene in der App-Struktur befindet, also IboDetailsGeneral
ist untergeordnet von IBOsNavigationElement
.
Deshalb füge ich NavigationElementsService
in das Modul IBOsNavigationElement
ein:
NavigationModule
ist das Modul IBOsNavigationElement
Konsole:
CALLING updateIBOsNavigation FUNCTION
updateIBOsNavigation "95"
CALLING updateIBOsNavigation FUNCTION AGAIN
updateIBOsNavigation "test"
Diese Konsolenergebnisse sagen mir Folgendes:
Meine Tests:
IBOsNavigationElement
(Listener) aufzurufen , und die Kommunikation mit dem Dienst ist gut. NavigationElementsService
zu providers
hinzugefügt wird, ist in NavigationModule
, es gibt also nur eine Instanz des Service-Rechts? Dann findet das Problem, das in dem folgenden Link erläutert wird, nicht statt: Angular 2 beobachtbares Abonnement nicht Triggerung
Es tut mir wirklich leid für meine 'Wand des Textes' , aber an diesem Punkt bin ich irgendwie verzweifelt.
Jede Hilfe ist dankbar, danke!
Update 1:
Nach der ersten Antwort habe ich mehrere Dinge ausprobiert ...
Verwenden von ReplaySubject
:
Ergebnis: Beim Aufruf von updateIBOsNavigation()
löst subscribe()
immer noch nicht aus.
Verwenden von BehaviorSubject
:
Ergebnis: Er gibt subscribe()
bei der Initialisierung ein, aber wenn ich updateIBOsNavigation()
aufruft, löst subscribe()
immer noch nicht aus.
Verwenden von BehaviorSubject
v2:
Ich habe diesen Ansatz versucht: behaviourSubject in angular2, wie es funktioniert und wie man es benutzt
%Vor% Ergebnis: Wie vorherige Anwendung von BehaviorSubject
.
Update 2:
Mehr Beispiele für verzweifelte Versuche nach Recherchen im gesamten Internet ...
Verwenden von BehaviorSubject
v3:
Ergebnis: Wie vorher BehaviorSubject
versucht ... Die Verzweiflung steigt ...
Update 3:
Nur für den Fall, ich wollte sicherstellen, dass NavigationElementsService
ein Singleton ist:
Und beim Importieren:
%Vor% Ergebnis: Gleiches Problem wie immer, subscribe()
löst nicht aus, aber zumindest weiß ich, dass es eine Instanz von NavigationElementsService
gibt.
Ich denke, das Problem ist Ihr Subject
type Mit Subject
erhält jede Komponente, die nach dem Auslösen eines Ereignisses abonniert wird, KEINEN Wert. Um den vorherigen Wert für späte Abonnenten wiederzugeben, verwenden Sie BehaviorSubject
oder ReplaySubject
anstelle von Subject
.
Mehr zu verschiedenen Betreff-Typen aus Ссылка
Verhaltensthema
Wenn ein Beobachter ein BehaviorSubject abonniert, beginnt er mit der Ausgabe des zuletzt vom Observable-Objekt emittierten Elements (oder eines Seed / Default-Werts, wenn noch keins emittiert wurde) und gibt dann weitere Elemente aus, die später von dem Object emittiert werden Quelle Observable (s).
ReplaySubject
ReplaySubject sendet an jeden Beobachter alle Elemente, die von den beobachtbaren Quellen gesendet wurden, unabhängig davon, wann der Beobachter sich anmeldet.
A BehaviorSubject
benötigt beim Einrichten einen Standardwert. Sie müssen es also mit einem Wert erstellen:
A ReplaySubject
benötigt keinen Standardwert.
BEARBEITEN
Wenn Sie einen gemeinsam genutzten Dienst verwenden, müssen Sie außerdem sicherstellen, dass der Dienst NUR im Stammmodul bereitgestellt wird. Wenn mehrere Stellen zur Verfügung stehen, erhalten die Komponenten möglicherweise nicht dieselbe Instanz. Auch wenn der Dienst auf der Stammebene bereitgestellt wird, wird, wenn ein Modul zwischen der Stammebene und Ihrer Komponente den Dienst bereitstellt, eine neue Instanz in den Zweig der Dependency-Injection-Struktur gesendet.
Hoffe, das hilft.
Wenn wir einen Dienst in "Providers" aufnehmen, wird er instanziiert und dieser Status wird zwischen seiner Komponente und seinen untergeordneten Komponenten beibehalten.
Und wenn wir den Dienst in beide Komponenten-Provider-Arrays einschließen, dann ist es kein Singleton mehr. Der Staat wird unabhängig sein und nicht zwischen ihnen geteilt werden.
Fügen Sie Ihren Dienst also nur der übergeordneten Komponente oder der Stammkomponente hinzu.
Auch ich habe dieses Problem gelöst und mit Hilfe dieser Lösung hier Ссылка gelöst.
Tags und Links angular angular2-observables