RxJS Observable Share состояние startWith () в слиянии ()

Собственно, это указано в документации. Взгляните на его Javadoc здесь . На основе этого документа вам нужно получить доступ к сеансу следующим образом:

String someValue = null;
session.lock();
try {
    someValue = session.getAttribute("SomeKey");
} finally {
    session.unlock();
}

Полный Javadoc различных версий рамочной системы Vaadin можно увидеть здесь здесь .

Кстати, я предлагаю вам использовать последнюю версию потока Vaadin, которая равна 10.0.1

0
задан Webber 20 January 2019 в 00:10
поделиться

3 ответа

Сначала наличие startWith на всех этих наблюдаемых означает, что они все испустят в начале ложь. Как будто вы нажали все эти кнопки одновременно.

Я думаю, вы должны попытаться добиться другого поведения. Используя startWith, вы хотите установить начальное состояние свойства modal, верно? Поэтому оно должно прийти после слияния этих потоков вместе.

Для переключения значения вам нужны две вещи:

  1. место, где хранить состояние (обычно аккумулятор scan)
  2. различать эти нажатия кнопок У вас есть три кнопки, поэтому вам нужно три значения.

Это мой подход:

 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, он возвращает его - таким образом он устанавливает новое состояние независимо от предыдущего значения.

0
ответ дан Martin Nuc 20 January 2019 в 00:10
поделиться

Я использовал подход всех и придумал это. Он сохраняет логику toggle () внутри функции карты & amp; использует startWith () для установки значения.

  const modal$ = merge(
    toggle$.pipe(
      map(() => prev => !prev),
    ),
    show$.pipe(
      map(() => prev => true),
    ),
    hide$.pipe(
      map(() => prev => false),
    )
  ).pipe(
    startWith(false),
    scan((state, change) => change(state)),
  );
0
ответ дан Webber 20 January 2019 в 00:10
поделиться

Чтобы сделать это, вам нужно будет управлять состоянием немного по-другому, что-то похожее на то, что люди делают в редуксе. Взгляните на пример:

const { of, merge, fromEvent } = rxjs; // = require("rxjs")
const { map, scan } = rxjs.operators; // = require("rxjs/operators")

const toggle$ = fromEvent(document.getElementById('toggle'), 'click');
const show$ = fromEvent(document.getElementById('show'), 'click');
const hide$ = fromEvent(document.getElementById('hide'), 'click');

const reduce = (state, change) => change(state);

const initialState = false;
const state$ = merge(
  of(e => e),
  toggle$.pipe(map(e => state => !state)),
  show$.pipe(map(e => state => true)),
  hide$.pipe(map(e => state => false)),
).pipe(
  scan(reduce, initialState),
);

state$.subscribe(e => console.log('state: ', e));
<script src="https://unpkg.com/rxjs@6.2.2/bundles/rxjs.umd.min.js"></script>


<button id="toggle">Toggle</button>
<button id="show">Show</button>
<button id="hide">Hide</button>

Чтобы лучше понять, как это работает, взгляните на Создание приложений Статья из документации rxjs

0
ответ дан Oles Savluk 20 January 2019 в 00:10
поделиться
Другие вопросы по тегам:

Похожие вопросы: