Подтвердить что ты не робот

Как заставить Vaadin v8 обновить экран?

У меня есть небольшое приложение Vaadin v8, которое имеет несколько полей ввода (комбинированные списки, группы выбора и т.д.). Содержание большинства из них определяется выбранным содержимым первого ComboBox. Однако, когда я выбираю что-то в нем, все остальные остаются пустыми, пока я не нажму один, и в этот момент все они обновляются. Это нежелательное поведение, но я предполагаю, что оно вызвано обновлением на стороне сервера, но не обновлением представления на стороне клиента. (Даже при добавлении requestRepaint() в мой первый Combobox ValueChangeListener)

Должен быть какой-то метод, чтобы заставить Vaadin получать данные, которые я хочу, чтобы они отображались, даже если другие компоненты не нажаты?

РЕДАКТИРОВАТЬ Мне не разрешено так скоро публиковать ответы на свой вопрос, поэтому я временно выкладываю его здесь:

Я обнаружил, что существует метод javascript, который синхронизирует клиента и сервера.

myComponent.getApplication().getMainWindow().executeJavaScript("javascript:vaadin.forceSync();");

Единственная проблема, с которой я столкнулся сейчас, заключается в том, что ValueChangeListener в одном из моих списков срабатывает, только когда я щелкаю другой список (или тот же самый дважды). Это самая странная вещь, потому что второй комбобокс при загрузке прекрасно запускает событие.

4b9b3361

Ответ 2

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

yourcomponent.setContainerDataSource(yourcomponent.getContainerDataSource());

Ответ 3

У меня была такая же проблема, смотрите ниже, как это можно сделать в версии 8.0.5 (с 2017 года):

@Push
public class WebUi extends UI {
   public void fireComponentUpdated() {
      getUI().push();
   }
}

Ответ 4

Вы запросилиRepaint на правильных компонентах?

Имейте в виду, что requestRepaint помещает компонент как грязный, но не означает, что он будет перекрашен - клиент может быть обновлен только тогда, когда он делает запрос на сервер.

Смотрите эту тему https://vaadin.com/forum/-/message_boards/view_message/231271 для получения дополнительной информации о ваших вариантах (она касается обновления пользовательского интерфейса из-за обработки фоновых потоков).

Ответ 5

В Vaadin 7 достаточно поставить эту строку в основной метод UI.init(VaadinRequest):

UI.getCurrent().setPollInterval( 1000 );

если вы хотите обновить свой интерфейс (в этом случае) каждую секунду. Таким образом вы инструктируете пользовательский интерфейс для опроса сервера для изменений в определенном интервале.

Остерегайтесь, чрезмерный трафик сервера может быть проблемой, если у вас много пользователей, которые используют ваше приложение одновременно.

В Vaadin 6 вам придется играть с ProgressIndicator (который может быть невидимым, если вы хотите) и попытаться сделать то же, что и UI.getCurrent(). setPollInterval (int) в Vaadin 7 делает.