Я путаю с Observable
с тех пор, как начал работать с Angular
(не AngularJS) и rxjs
.
Observable
- удобный и удобный способ организации информации. Однако это становится очень громоздким, когда смешивается с обычными значениями.
Например, предположим, у нас есть таблица данных, в которой в каждой строке есть флажок, а в строке заголовка есть флажок «выбрать все». Очень распространенный вариант использования.
Источник данных таблицы данных - Observable
. Таким образом, псевдокод будет выглядеть так:
// sample.component.ts, suppose data source comes from ngrx store
rows$ = this.store.pipe(select(selectRows));
// sample.component.html
<table [dataSource]="rows$">
При такой настройке мы можем установить флажок для каждой строки данных следующим образом, сохраняя состояние включения / выключения в локальном состоянии:
// sample.component.ts
state = { selection: {} };
handleSelect(id, event) {
this.state.selection[id] = event.checked;
}
Теперь вот проблемы:
Чтобы вычислить состояние «все выбрано или нет», мне нужно знать как rows$
, так и this.state.selection
, чтобы я мог определить, все ли строки выбраны или нет.
Однако rows$
- это Observable
, а this.state.seletion
- обычный объект. Мои варианты:
a) Преобразуйте this.state.selection
в Observable
, создав rxjs.Subject
и обновив его значение в каждом handleSelect()
обработчике событий, затем объедините этот новый Observable
с rows$
, чтобы вычислить «все выбранные» состояние
b) Подписаться rows$
и преобразовать его в обычный массив rows
, а затем вычислить состояние all selected
в handleSelect()
Когда пользователь нажимает флажок «выбрать все», мне нужно обновить this.state.selection
, чтобы назначить все идентификаторы true
или false
. Опять же, все идентификаторы должны быть получены из rows$
, то есть Observable
. Так что есть два варианта:
a) Преобразовать событие «выбрать все» в Observable
, затем объединить его с rows$
и обновить this.state.selection
в качестве побочного эффекта
b) То же, что и 1.b), подпишите rows$
на rows
и выполните расчет в обработчике handleSelectAll()
Мне кажется, что самый простой способ - сначала преобразовать rows$
в rows
и НЕ использовать Observable
в компоненте. Потому что для использования Observable
мне нужно преобразовать все остальное (состояние, события, ...) в Observable
.
Но если я прав, почему ngrx
предоставляет Observable
интерфейс только?
Так что я думаю, что думаю что-то не так.
Буду признателен, если кто-нибудь расскажет об этом немного.