2016-03-15 5 views
5

Ich möchte einen einfachen Toggle innerhalb eines Angular2-Dienstes schreiben.Erhalte den aktuellen Wert von Subject.asObservable() in Angular Service

Daher brauche ich den aktuellen Wert eines Subject Ich beobachte (siehe unten).

import {Injectable} from 'angular2/core'; 
import {Subject} from 'rxjs/Subject'; 

@Injectable() 

export class SettingsService { 

    private _panelOpened = new Subject<boolean>(); 
    panelOpened$ = this._panelOpened.asObservable(); 

    togglePanel() { 
    this._panelOpened.next(!this.panelOpened$); 
    } 

} 

Wie kann ich den aktuellen Wert von _panelOpened/panelOpened $ bekommen?

Danke.

Antwort

7

Scheint Sie suchen BehaviorSubject

private _panelOpened = new BehaviorSubject<boolean>(false); 

Wenn Sie abonnieren Sie den letzten Wert als erste Veranstaltung.

togglePanel() { 
    this.currentValue = !this.currentValue; 
    this._panelOpened.next(this.currentValue); 
} 
+1

Gegenstand oder BehaviorSubject sollte in diesem Fall keine Rolle. Ich weiß, wie man subskribiert, aber ** gibt es keine Möglichkeit, den Wert ohne ein Abonnement zu erhalten? ** Ein bisschen eine Überlastung zu abonnieren/abmelden jedes Mal, wenn ich einfach den aktuellen Wert möchte ... Das Abonnement ist mehr zu benachrichtigt werden, wenn sich der Wert ändert - wie ich es sehe. – Sommereder

+0

Ordnen Sie den letzten Wert einem lokalen Feld zu. –

+0

Ich habe meine Antwort aktualisiert. –

2

Um @MattBurnell in den Kommentaren der angenommenen Antwort näher zu erläutern;

Wenn Sie nur den aktuellen Wert möchten (und Sie möchten nicht, dass viele Abonnements frei herumlaufen), können Sie einfach die Methode getValue() des BehaviorSubject verwenden.

import {Component, OnInit} from 'angular2/core'; 
import {BehaviorSubject} from 'rxjs/subject/BehaviorSubject'; 

@Component({ 
    selector: 'bs-test', 
    template: '<p>Behaviour subject test</p>' 
}) 
export class BsTest implements OnInit { 

    private _panelOpened = new BehaviorSubject<boolean>(false); 
    private _subscription; 

    ngOnInit() { 
    console.log('initial value of _panelOpened', this._panelOpened.getValue()); 

    this._subscription = this._panelOpened.subscribe(next => { 
     console.log('subscribing to it will work:', next); 
    }); 

    // update the value: 
    console.log('==== _panelOpened is now true ===='); 
    this._panelOpened.next(true); 

    console.log('getValue will get the next value:', this._panelOpened.getValue()); 
    } 
} 

Dies führt zu:

initial value of _panelOpened false 
subscribing to it will work: false 
==== _panelOpened is now true ==== 
subscribing to it will work: true 
getValue will get the next value: true 

plunker Siehe:

Verwandte Themen