RxJs получают значение от наблюдаемого
В компоненте:
singleEvent$: Observable<Event>;
В init, я получаю наблюдаемый
this.singleEvent$ = this._eventService.events$
.map(function (events) {
let eventObject = events.find(item => item.id === eventid);
let eventClass: Event = new Event(eventObject);
return eventClass;
});
Как я могу взять текущее значение, например event.name
?
Ответы
Ответ 1
Чтобы получить данные из наблюдаемой, вам необходимо подписаться:
this.singleEvents$.subscribe(event => this.event = event);
В шаблоне вы можете напрямую связать наблюдаемые объекты с помощью асинхронного канала:
{{singleEvents$ | async}}
Ответ 2
Чтобы добавить к ответу Гюнтера Цобауэра, BehaviorSubject может быть тем, что вы ищете, если вы хотите синхронно получить значение внутри вашего Observable.
BehaviorSubject - это Observable, у которого всегда есть значение, и вы можете вызвать myBehaviorSubject.getValue()
или myBehaviorSubject.value
, чтобы синхронно получить значение, которое BehaviorSubject в настоящее время содержит.
Поскольку он сам по себе также является наблюдаемым, вы все равно можете подписаться на BehaviorSubject, чтобы асинхронно реагировать на изменения в значении, которое он содержит (например, myBehaviorSubject.subscribe(event => { this.event = event })
), и использовать асинхронный канал в шаблоне компонента (например, {{ myBehaviorSubject | async }}
).
Вот несколько примеров использования вашего примера для создания объекта BehaviorSubject в вашем компоненте из данного сервиса:
@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);
}
});
}
}