Как я могу заставить Vaadin обновить экран? - PullRequest
17 голосов
/ 30 сентября 2011

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

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

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

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

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

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

Ответы [ 5 ]

18 голосов
/ 30 сентября 2011

Является ли первый ComboBox в "немедленном" режиме?

Если нет, вероятно, это должно быть: component.setImmediate (true).

См. https://vaadin.com/book/-/page/components.selection.html

4 голосов
/ 30 ноября 2017

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

@Push
public class WebUi extends UI {
   public void fireComponentUpdated() {
      getUI().push();
   }
}
4 голосов
/ 30 сентября 2011

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

yourcomponent.setContainerDataSource(yourcomponent.getContainerDataSource());
2 голосов
/ 30 сентября 2011

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

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

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

1 голос
/ 24 июня 2016

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

UI.getCurrent().setPollInterval( 1000 );

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

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

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

...