2016-03-15 30 views
5

Voglio scrivere un semplice interruttore all'interno di un servizio Angular2.Ottieni il valore corrente di Subject.asObservable() all'interno del servizio Angular

Pertanto ho bisogno del valore corrente di un Subject che osservo (vedi sotto).

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

} 

Come ottengo il valore corrente da _panelOpened/panelOpened $?

Grazie.

risposta

7

Sembra siete alla ricerca di BehaviorSubject

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

Se si è abbonati si ottiene l'ultimo valore come primo evento.

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

oggetto o BehaviorSubject non dovrebbe importare in questo caso. So come iscriversi, ma ** non c'è un modo per ottenere il valore senza un abbonamento? ** Un po 'di sovraccarico per iscriversi/annullare la sottoscrizione ogni volta che voglio semplicemente il valore corrente ... L'abbonamento è più per ricevere una notifica quando il valore cambia, come vedo io. – Sommereder

+0

Basta assegnare l'ultimo valore a un campo locale. –

+0

Ho aggiornato la mia risposta. –

2

Per elaborare @MattBurnell nei commenti della risposta accettata;

Se si desidera semplicemente il valore corrente al momento (e non si desidera far fluttuare molte sottoscrizioni), è sufficiente utilizzare il metodo getValue() del 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()); 
    } 
} 

Questo si tradurrà in:

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 

Vedi plunker: