別の UI インスタンスからグリッドに変更が加えられた後、Vaadin でグリッドを更新しようとしています。
詳しく説明すると、UI1 と UI2 (2 つの異なるブラウザーのタブ) という 2 つの異なる UI インスタンスがあります。これらの UI インスタンスには、名前、年齢、性別などのさまざまなプロパティを持つ Contact オブジェクトで構成されるグリッドを含むビューが含まれています。
UI1 からグリッドに Contact を追加し、UI2 が更新されたグリッドを更新せずに即座に表示するようにします。
これを実現するには、Broadcaster クラスを使用して既にセットアップした Vaadin Push を使用する必要があることを知っています。View クラスがメソッドreceiveBroadcast()
を使用して UI にブロードキャストを送信するたびに UI を更新する UI クラスにbroadcast()
メソッドがあります。私のUIクラスの一部は次のようになります:
@Title("Contact Book")
@Theme("reindeer")
@Push
public class UserInterface extends UI implements BroadcastListener{
private Navigator navigator;
@Override
protected void init(VaadinRequest request){
navigator = new Navigator(this, this);
navigator.addView(ContactBookView.NAME, new ContactBookView());
Broadcaster.register(this);
}
@Override
public void detach(){
Broadcaster.unregister(this);
super.detach();
}
@Override
public void receiveBroadcast(Grid grid) {
access(()->{
// update grid here
Notification.show("Grid updated", Notification.Type.TRAY_NOTIFICATION);
});
}
}
そして、私の Broadcaster クラスはこのリンクと同じです(メソッドを少し変更しただけなので、グリッドをパラメーターとして渡すことができます)
次に、私の ContactBookView クラスでBroadcaster.broadcast(grid)
、アイテムを追加または変更した後にメソッドを呼び出して、UI クラスのaccess()
メソッドでグリッドを何らかの方法で更新できるようにしますが、試したことがうまくいかないようです。ブロードキャストを受信すると、すべての UI インスタンスで「グリッドが更新されました」というメッセージが表示されるため、プッシュが機能していることがわかります。
ビューを削除して再初期化しようとしました
navigator.removeView(ContactBookView.NAME);
navigator.addView(ContactBookView.NAME, new ContactBookView());
グリッドを完全に空にして補充しようとした
grid.removeAllColumns();
grid.setContainerDataSource(container);
この醜い回避策を使用して、グリッドを強制的に更新しようとしました
grid.setContainerDataSource(grid.getContainerDataSource());
UI を強制的に同期するために JavaScript クエリを実行しようとしました
JavaScript.getCurrent().execute("javascript:vaadin.forceSync();");
しかし、これらのどれも機能しませんでした。多分私は何か他の間違ったことをしていますか?参考までに、Vaadin のバージョンは 7.5.0 です。
何かご意見やアドバイスをいただければ幸いです
ありがとう。