0

別の 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 です。

何かご意見やアドバイスをいただければ幸いです

ありがとう。

4

2 に答える 2

1

使用している場合navigator.navigateTo(PortletUI.SOMEPAGE);

somePageInstance では最初のenter()メソッドを呼び出す必要がありますが、ナビゲーター経由でそこに来るので、そこでグリッドを更新しようとすることはできません:o)

ポートレットUI:

public static final String SOMEPAGE = null;
Navigator navigator;

SomePage somePageInstance = null;

 protected void init(VaadinRequest request) {
        InitPortlet.initPortlet(this);

        // Create a navigator to control the views
        navigator = new Navigator(this, this);

       somePageInstance = new SomePage();

        navigator.addView(SOMEPAGE, somePageInstance);

一部のページ:

public class SomePage extends SomePageDesign implements View{

//or you can give there navigator from portlet through constructor probably
Navigator navigator; 

@Override
    public void enter(ViewChangeEvent event) {
         //needed for navigate to another page :)
        navigator = event.getNavigator();
        //Update grid
    }
}

それがあなたを助けることを願っています:)

于 2015-07-03T09:26:57.127 に答える