2016-03-15 21 views
5

Chcę napisać prosty przełącznik wewnątrz usługi Angular2.Uzyskaj bieżącą wartość obiektu Subject.asObservable() wewnątrz usługi Angular Service

Dlatego potrzebuję aktualnej wartości Subject obserwuję (patrz poniżej).

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$); 
    } 

} 

Jak uzyskać bieżącą wartość z _panelOpened/panelOpened $?

Dzięki.

Odpowiedz

7

Wydaje szukasz BehaviorSubject

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

Jeśli abonament masz ostatnią wartość jako pierwszego zdarzenia.

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

Temat lub BehaviorSubject nie powinno mieć znaczenia w niniejszej sprawie. Wiem, jak się zapisać, ale ** nie ma sposobu na uzyskanie wartości bez subskrypcji? ** Trochę przeciążenia, aby zasubskrybować/wypisać za każdym razem, gdy chcę po prostu aktualną wartość ... Subskrypcja jest bardziej otrzymuj powiadomienie, gdy wartość zmieni się - jak widzę. – Sommereder

+0

Wystarczy przypisać ostatnią wartość do lokalnego pola. –

+0

Zaktualizowałem moją odpowiedź. –

2

Aby opracować na @MattBurnell w komentarzach zaakceptowanej odpowiedzi;

Jeśli obecnie potrzebujesz tylko aktualnej wartości (a nie chcesz, aby wiele subskrypcji było unoszonych), możesz po prostu użyć metody getValue() obiektu BehaviorSubject.

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()); 
    } 
} 

To spowoduje:

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 

Zobacz plunker:

Powiązane problemy