2017-02-16 3 views
3

Ich benutze andere Module, so dass es in lazy geladenen Modulen verwendet werden kann. Hier ist meine Servicedatei.Ich möchte rxjs Betreff verwenden, um die Wertänderung in mehreren Komponenten zu erkennen. Aber es zeigt nur Änderungen in der Komponente, die es ändert

import {NgModule, Injectable } from '@angular/core' 
 
import {Subject} from 'rxjs/Subject'; 
 

 
@Injectable() 
 
export class ChangeEventService { 
 

 
    public invokeEvent:Subject<any> = new Subject(); 
 
    // localId:any = { name:'', eventId:0, orgId:0}; 
 
    constructor() { 
 
     
 
    } 
 

 
    public callComponent(currentId:any):void { 
 
     console.log("Invoked"); 
 
     this.invokeEvent.next({localId:currentId}); 
 
    } 
 
} 
 

 
@NgModule({ 
 
    imports: [ ], 
 
    exports : [ 
 
    ], 
 
    providers: [ ChangeEventService ], 
 
}) 
 
export class ChangeEventModule { }

Abonnement Rxjs Gegenstand verändert sich nur in der Komponente/Dienst, die Sie verändert.

export class xyz { 
 
    constructor(private change: ChangeEventService) { 
 
        this.change.invokeEvent.subscribe((value) => { 
 
         this.event = value.localId; 
 
         console.log("I'm chnaged...!!"); 
 
        }); 
 
    } 
 

 
    
 
    anyFunction(eventdata:any) { 
 
      this.change.callComponent(eventdata); 
 
    } 
 
}

ich die einzige aktualisierte Wert in der Komponente, die den Wert von InvokeEvent ändern.

+0

Können Sie überprüfen, wie oft der Konstruktor ausgeführt wird. Sie haben möglicherweise mehrere Instanzen des 'ChangeEventService'. – Philipp

+1

ist 'this.change.invokeEvent.callComponent (eventdata);' Angenommen, 'this.change.callComponent (eventdata);' – shusson

+0

@shusson: +1. Sind Sie sicher, dass 'ChangeEventService' ein Singleton ist? Wird es in 'NgModule.providers 'eines Moduls deklariert, das ** eifrig geladen ** ist (vs lazily-loaded)? – AngularChef

Antwort

1

Als @Philipp kommentiert Ich habe mehrere Instanzen meines Dienstes erstellt, indem ich es in mehreren Modulen zur Verfügung stellte. Und wie von @AngularFrance vorgeschlagen, habe ich darin Anbieter von app.module (1. Modul meiner App) erklärt. als ich in einem Abonnement (außer dem, der callComponent angerufen hat) zum ersten Mal keinen aktualisierten Wert bekommen habe. Also habe ich BehaviorSubject benutzt und ihm irgendeinen zufälligen Anfangswert gegeben. Jetzt wird der Anfangswert an eine Komponente gesendet und der aktualisierte Wert wird an alle Abonnenten gesendet, wenn sie aktualisiert wird.

Also ich denke, dass das mein Problem gelöst hat.

Verwandte Themen