typescript - RxJs få verdi fra observable
I komponent :
singleEvent$: Observable<Event>;
Ved init får jeg observerbar
this.singleEvent$ = this._eventService.events$
.map(function (events) {
let eventObject = events.find(item => item.id === eventid);
let eventClass: Event = new Event(eventObject);
return eventClass;
});
Hvordan kan jeg ta den nåværende verdien som event.name ?
Svar #1
For å hente data fra et observabelt, må du abonnere:
this.singleEvents$.subscribe(event => this.event = event);
I malen kan du binde direkte til observables ved å bruke async-pipen:
{{singleEvents$ | async}}
Svar #2
For å legge til Günter Zöbauers svar, kan et BehaviorSubject være det du leter etter hvis du ønsker å få verdien inne i din Observable synkront.
Et BehaviorSubject er et Observable som alltid har en verdi, og du kan kalle myBehaviorSubject.getValue() eller myBehaviorSubject.value for å synkront hente verdien BehaviorSubject for øyeblikket holder.
Siden det i seg selv også er en observable, kan du fortsatt abonnere på BehaviorSubject for å asynkront reagere på endringer i verdien den holder (f.eks. myBehaviorSubject.subscribe(event => { this.event=event })) og bruke async-pipen i komponentens mal (f.eks. {{ myBehaviorSubject | async }}).
Her er noen eksempler på bruk for å matche ditt gitte eksempel for å opprette en BehaviorSubject i komponenten din fra den gitte tjenesten:
@Component({
//...
})
export class YourComponent implements OnInit {
singleEvent$: BehaviorSubject<Event>;
constructor(private eventService: EventService){}
ngOnInit(){
const eventid = 'id'; // <-- actual id could go here
this.eventService.events$
.pipe(
map(events => {
let eventObject = events.find(item => item.id === eventid);
let eventClass: Event = new Event(eventObject);
return eventClass;
})
)
.subscribe(event => {
if(!this.singleEvent$){
this.singleEvent$ = new BehaviorSubject(event);
} else {
this.singleEvent$.next(event);
}
});
}
}
Svar #3
Du kan bruke observable.pipe(take(1)).subscribe for å begrense observablen til å få bare én verdi og slutte å lytte etter flere.
let firstName: string;
this.insureFirstName
.pipe(take(1)) //this will limit the observable to only one value
.subscribe((firstName: string) => {
this.firstName = firstName; asssgning value
});
console.log(this.firstName); //accessing the value
