web-dev-qa-db-ja.com

Vaadin v8で画面を強制的に更新するにはどうすればよいですか?

いくつかの入力フィールド(コンボボックス、選択グループなど)がある小さなVaadin v8アプリケーションがあります。これらのほとんどのコンテンツは、最初のComboBoxの選択されたコンテンツによって決定されます。ただし、その中から何かを選択すると、1つをクリックするまで他のすべてが空白のままになり、その時点ですべて更新されます。これは望ましい動作ではありませんが、サーバー側が最新でクライアント側のビューが更新されていないことが原因であると思います。 (最初のComboboxのValueChangeListenerにrequestRepaint()を追加する場合でも)

他のコンポーネントがクリックされていない場合でも、表示するデータをVaadinに強制させる何らかの方法が必要ですか?

編集私は自分の質問への回答を投稿することを許可されていないので、一時的にここに入れます:

クライアントとサーバーを同期するJavaScriptメソッドがあることがわかりました。

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

私が今持っている唯一の問題は、私のコンボボックスの1つのValueChangeListenerが、別のコンボボックス(または同じコンボボックス)を2回クリックしたときにのみ発生することです。 2番目のコンボボックスがロードされると、そのイベントを完全に発生させるので、これは最も奇妙なことです。

17
Valyrion

最初のComboBoxは「即時」モードですか?

そうでない場合は、おそらく:component.setImmediate(true)である必要があります。

https://vaadin.com/book/-/page/components.selection.html を参照してください

18
Charles Anthony

私は同じ問題を抱えていました、以下のバージョン8.0.5(2017以降)でそれがどのように行われるかを参照してください:

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

Vaadinに強制的に再レン​​ダリングさせるコンポーネントのデータソースを設定している場合に使用できるハックがあります。動的データを持つテーブルを更新するためにこれを使用します

yourcomponent.setContainerDataSource(yourcomponent.getContainerDataSource());
4
Marthin

正しいコンポーネントでリペイントをリクエストしましたか?

requestRepaintはコンポーネントをダーティとしてマークしますが、再描画されることを意味しないことに注意してください。クライアントは、サーバーにリクエストを行ったときにのみ更新できます。

オプションの詳細については、このスレッド https://vaadin.com/forum/-/message_boards/view_message/231271 を参照してください(バックグラウンドスレッド処理によるUIの更新を扱います)。

2
Ryan Schipper

Vaadin 7ではこの行をメインのUI.init(VaadinRequest)メソッドに配置するだけで十分です。

UI.getCurrent().setPollInterval( 1000 );

uI(この場合)を毎秒更新したい場合。このようにして、定義された間隔の変更についてサーバーをポーリングするようにUIに指示します。

同時にアプリケーションを使用する多くのユーザーがいる場合、過度のサーバートラフィックが問題になる可能性があることに注意してください。

Vaadin 6の場合 ProgressIndicator(必要に応じて非表示にすることもできます)で遊んで、Vaadin 7のUI.getCurrent()。setPollInterval(int)と同じように実行する必要があります。

1
user2310395