2016-07-14 26 views
5

So habe ich gerade mit der Programmierung mit Angular 2 begonnen und habe gerade angefangen, über Subscribe, Subject und BehaviorSubject zu lernen. Derzeit habe ich mehrere Abonnements, um Werte zu erhalten, die in meinem Dienst gespeichert sind und an eine Komponente gesendet werden. Meine Anwendung funktioniert und alle, aber ich weiß, dass es sehr ineffizient ist. Dass es hat aus der Hand in meiner Komponente bekommen:So kombinieren Sie mehrere Observables in Angular 2

this.threatService.minLimitChange$.subscribe(min => { this.min = min; this.getSession();}); 
this.threatService.maxLimitChange$.subscribe(max => { this.max = max; this.getSession();}); 

(und wie 5 andere mehr, die einen einzelnen Wert erhält und ruft Funktion getSession() jedes Mal)

In meinem threat.service:

private minLimitChangeSource = new BehaviorSubject<number>(this.min); 
private maxLimitChangeSource = new BehaviorSubject<number>(this.max); 
minLimitChange$ = this.minLimitChangeSource.asObservable(); 
maxLimitChange$ = this.maxLimitChangeSource.asObservable(); 

Also habe ich versucht:

this.threatService.minLimitChange$.concat(this.threatService.maxLimitChange$).subscribe(res => console.log(res)); 

welche mein Ziel war einfach zu testen, was res war, weil ich nicht sicher war, wie man auf die zwei Werte zugreift ... aber ich bekomme das in meiner Konsole. ;/

TypeError: this.threatService.minLimitChange$.merge is not a function. (In 'this.threatService.minLimitChange$.concat(this.threatService.maxLimitChange$)', 'this.threatService.minLimitChange$.concat' is undefined) 

Schließlich würde Ich mag alle Werte erhalten, die getSession() von meinem Dienst benötigt und diese Funktion einmal laufen. Ich würde wirklich jede Hilfe oder Erklärung schätzen, wie man concat, merge oder forkJoin benutzt, um meine Abonnements zu kombinieren. Vielen Dank!

Antwort

10

können Sie Observable.combineLatest verwenden 2 beobachtbaren Ströme zu einem kombinieren:

combineObs = obs1.combineLatest(obs2, 
    (val1, val2) => { 
    return {val1: val1, val2: val2}; 
    }); 

Arbeiten Plunker: http://plnkr.co/edit/mmCzEmdKexpaWNM53me9?p=preview

+0

Ah sehe ich! Das scheint nahe zu sein, was ich will, aber ich benutze die Werte nicht über die {{}} Methode im HTML. Meine Anwendung ist eigentlich ein Diagrammgenerator, der Datenpunkte entsprechend dem Schieberegler in der UI-Komponente anzeigt. So fließen die Daten: Slider in ** UI Component ** sendet Max- und Min-Werte> ** Service ** speichert und sendet an Abonnenten> ** Chart Component ** führt eine Funktion mit diesen Werten aus. Also, wenn ich den combinateLatest in meiner Diagrammkomponente platzieren würde, wie würde ich es lokal in den Max- und Min-Werten der Komponente zuweisen? – mshantic

+0

Hey überprüfen Sie den angehängten PLNKR Link. Grundsätzlich besteht die Idee darin, Ihre Aufgabe in 2 Schritten zu lösen: 1. Kombinieren Sie zwei Ströme zu einem, der dritte Strom gibt jedes Mal einen neuen Wert aus, wenn einer der Quellströme einen neuen Wert hat; 2. Hören Sie sich den kombinierten Stream an und füllen Sie Ihre lokalen Daten basierend auf den kombinierten Daten. Ich habe beides in der PLNKR demonstriert. –

+1

Vielen Dank! Es funktioniert jetzt und reduziert eine Menge redundanten Code. Wurde verloren, weil ich keine Klasse wie Einstellungen hatte und ich hatte einen separaten Dienst und eine Hauptkomponente, so dass die Funktionen und Variablen nicht zusammen sind wie Ihre Plunker. Aber ich verstehe jetzt (: Danke nochmal! – mshantic