Сначала наличие startWith
на всех этих наблюдаемых означает, что все они будут излучать в начале ложь.Как будто вы нажали все эти кнопки одновременно.
Я думаю, вы должны попытаться добиться другого поведения.Используя startWith
, вы хотите установить начальное состояние свойства modal
, верно?Следовательно, он должен появиться после объединения этих потоков.
Для переключения значения вам нужны две вещи:
- место, где хранится состояние (обычно аккумулятор
scan
) - Различают эти нажатия кнопок.У вас есть три кнопки, поэтому вам нужно три значения.
Это мой подход:
const modal$ = merge(
show$.pipe(mapTo(true)),
hide$.pipe(mapTo(false)),
toggle$.pipe(mapTo(null))
).pipe(
startWith(false),
scan((acc, curr) => {
if (curr === null) {
return !acc;
} else {
return curr;
}
})
);
Показать кнопку всегда выдает true
, кнопка скрытия выдает false
и кнопку переключенияиспускает null
.Я объединяю их вместе, и мы хотим начать с false
.Далее идет scan
, который хранит состояние в аккумуляторе.
Когда приходит null
, он возвращает отрицательное состояние.Когда приходит true
или false
, он возвращает его - таким образом он устанавливает новое состояние независимо от предыдущего значения.