typescript - RxJs få värde från observable
I komponent :
singleEvent$: Observable<Event>;
Vid init får jag 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;
});
Hur kan jag ta det aktuella värdet som event.name ?
Svar #1
För att få data från ett observerbart måste du prenumerera:
this.singleEvents$.subscribe(event => this.event = event);
I mallen kan du direkt binda till observables med async-pipen:
{{singleEvents$ | async}}
Svar #2
För att lägga till Günter Zöbauers svar kan ett BehaviorSubject vara det du letar efter om du vill få värdet inuti din Observable synkront.
En BehaviorSubject är en Observable som alltid har ett värde, och du kan anropa myBehaviorSubject.getValue() eller myBehaviorSubject.value för att synkront hämta det värde som BehaviorSubject för närvarande håller.
Eftersom det i sig självt också är ett observerbart objekt, kan du fortfarande prenumerera på BehaviorSubject för att asynkront reagera på förändringar i det värde som det innehåller (t.ex. myBehaviorSubject.subscribe(event => { this.event=event })) och använda async-pipen i din komponents mall (t.ex. {{ myBehaviorSubject | async }}).
Här är lite användning för att matcha ditt givna exempel för att skapa en BehaviorSubject i din komponent från den givna tjänsten:
@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 använda observable.pipe(take(1)).subscribe för att begränsa observabeln till att endast få ett värde och sluta lyssna efter fler.
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
