Собственно, это указано в документации. Взгляните на его Javadoc здесь . На основе этого документа вам нужно получить доступ к сеансу следующим образом:
String someValue = null;
session.lock();
try {
someValue = session.getAttribute("SomeKey");
} finally {
session.unlock();
}
Полный Javadoc различных версий рамочной системы Vaadin можно увидеть здесь здесь .
Кстати, я предлагаю вам использовать последнюю версию потока Vaadin, которая равна 10.0.1
Сначала наличие 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
, он возвращает его - таким образом он устанавливает новое состояние независимо от предыдущего значения.
Я использовал подход всех и придумал это. Он сохраняет логику 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)),
);
Чтобы сделать это, вам нужно будет управлять состоянием немного по-другому, что-то похожее на то, что люди делают в редуксе. Взгляните на пример:
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