Angular 2: Beobachtbar / Abonnement wird nicht ausgelöst

10

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

%Vor%

Diese Komponente löst die Methode des Dienstes aus: updateIBOsNavigation .

IBOsNavigationElement Komponente

%Vor%

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

%Vor%

Konsole:

  

CALLING updateIBOsNavigation FUNCTION

     

updateIBOsNavigation "95"

     

CALLING updateIBOsNavigation FUNCTION AGAIN

     

updateIBOsNavigation "test"

Diese Konsolenergebnisse sagen mir Folgendes:

  • Die Methode wird aufgerufen, daher kein Providerfehler. Die Kommunikation mit dem Dienst ist OK .

Meine Tests:

  • Ich habe versucht, eine zufällige Methode in IBOsNavigationElement (Listener) aufzurufen , und die Kommunikation mit dem Dienst ist gut.
  • Der einzige Ort, an dem 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 :

%Vor%

Ergebnis: Beim Aufruf von updateIBOsNavigation() löst subscribe() immer noch nicht aus.

Verwenden von BehaviorSubject :

%Vor%

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:

%Vor%

Ergebnis: Wie vorher BehaviorSubject versucht ... Die Verzweiflung steigt ...

Update 3:

Nur für den Fall, ich wollte sicherstellen, dass NavigationElementsService ein Singleton ist:

%Vor%

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.

    
SrAxi 12.04.2017, 15:55
quelle

2 Antworten

19

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:

%Vor%

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.

    
Tyler Jennings 12.04.2017, 16:04
quelle
1

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.

    
lalith kumar 25.12.2017 06:26
quelle

Tags und Links