Я создаю свое первое приложение Angular, и я борюсь с наблюдаемыми (сюрприз, сюрприз). У меня есть это в моем HTML-теге:
<mwl-calendar-month-view
*ngSwitchCase="'month'"
[viewDate]="viewDate"
[events]="observable | async"
[activeDayIsOpen]="true"
>
где я пытаюсь использовать асинхронный канал с моим наблюдаемым. Чтобы обновить значение наблюдаемого, я делаю несколько вызовов REST (после того, как пользователь нажимает кнопку), и вот как я обрабатываю щелчок:
observable: Observable<CalendarEvent[]>;
behaviourSubject: BehaviorSubject<CalendarEvent[]> = new BehaviorSubject([{
title: 'title12345',
start: new Date(),
end: new Date()
}]);
(...)
onCreateCalendarEventClick() {
let calendarEvent: CalendarEvent;
calendarEvent = {
title: (document.getElementById('calendarEventName') as HTMLInputElement).value,
start: new Date((document.getElementById('calendarEventStartDate') as HTMLInputElement).value),
end: new Date((document.getElementById('calendarEventEndDate') as HTMLInputElement).value),
color: undefined
};
let calendarEventApi: CalendarEventApi;
let calendarEventColor;
if (calendarEvent.color) {
calendarEventColor = calendarEvent.color;
}
calendarEventApi = {
title: calendarEvent.title,
start: ToApiMapper.formatDateTimeToApi(calendarEvent.start),
end: ToApiMapper.formatDateTimeToApi(calendarEvent.end),
color: ToApiMapper.mapColorToApi(calendarEventColor)
};
this.calendarService.saveCalendarEvent(calendarEventApi).subscribe( () => {
this.fetchCalendarData();
}, error => {
this.alertService.displayAlert('saving calendar event failed: ' + error);
});
}
private fetchCalendarData() {
const calendarEvents: CalendarEvent[] = [];
this.calendarService.fetchCalendarData(this.userService.getLoggedUser()).subscribe(calendarEventsApi => {
calendarEventsApi.forEach(calendarEventApi => {
const calendarEvent: CalendarEvent = {
title: calendarEventApi.title,
start: new Date(calendarEventApi.startDate),
end: new Date(calendarEventApi.endDate),
color: {
primary: calendarEventApi.eventColour,
secondary: calendarEventApi.eventColour
}
};
calendarEvents.push(calendarEvent);
});
this.behaviourSubject.next(calendarEvents);
this.observable = this.behaviourSubject.asObservable();
});
}
Я пытался воспроизвести поведение, описанное здесь: https://malcoded.com/posts/angular-async-pipe/ Как я понимаю, что происходит в моем коде: после получения тела ответа от вызова REST я обновляю следующее значение, которое будет иметь behaviorSubject. Затем я создаю новый наблюдаемый объект со следующим значением, уже установленным для моего желаемого ответа. Затем я обновляю наблюдаемое в HTML. HTML должен быть перезагружен (потому что он прослушивает изменение значения, а значение моего наблюдаемого только что изменилось). Новое значение из моего вызова REST должно быть видно в HTML. Что мне не хватает?