2016-03-21 21 views
2

現在GWTプロジェクトで作業中です。私は共通のブロックを複数のページ間で共有しています。その共通のブロックにいくつかのアクションボタンがあり、ページにはそれらのアクションボタンをクリックしてイベントを開始するハンドラがあります。GWT - 同じイベントで複数のハンドラを処理する方法

私が直面している問題は、ページAのアクションボタンの1つをクリックすると、事前に登録されたページBのハンドラも呼び出されるということです。

私が考えていた解決策は、ページからハンドラを削除して、同じアクションボタンイベントに対するハンドラが登録されているページが1つだけになるようにすることでした。

まず、私はアクションボタンのクリックイベントに登録し、保存HandlerRegistrationオブジェクトがのAddHandlerメソッドから返さ:

HandlerRegistration actionButtonClickEventHandlerRegistration=eventBus.addHandler(CommonBlockActionButtonClickedEvent.TYPE, someHandler);

そして、ページ変更イベントに、私が以前に保存されたHandlerRegistrationオブジェクト

からremoveHandlerを呼び出します
eventBus.addHandler(PageChangeEvent.TYPE, new PageChangeEventHandler() { 
    @Override 
    public void onMainPageChange(PageChangeEvent event) { 
     actionButtonClickEventHandlerRegistration.removeHandler(); 
    } 
}); 

だから、私は私のアプリを出せとそれらのページのうちの2つに行くとき、私はこのエラーを取得することを除いて、すべてのページにそれを実行します。

あなたは私がこのエラーまたは別の方法で問題を解決する理由を知っていますか?

ありがとうございます!

答えて

1

ハンドラを削除後にnullに設定し、削除する前に実際にnullかどうかを確認します。このよう :

eventBus.addHandler(PageChangeEvent.TYPE, new PageChangeEventHandler() { 
    @Override 
    public void onMainPageChange(PageChangeEvent event) { 
     if(actionButtonClickEventHandlerRegistration != null) { 
      actionButtonClickEventHandlerRegistration.removeHandler(); 
      actionButtonClickEventHandlerRegistration = null; 
     } 
    } 
}); 

それにもかかわらず、あなたは、少なくとも二回ハンドラを削除するように見えるし、そのために、あなたのプログラムロジックをチェックする必要があります。

これを行うには、ハンドラを削除する行のデバッガ(ブラウザの)にブレークポイントを設定するのが良い方法です。それを呼び出すたびにコールスタックを見ると、重複したコールを見つけて修正できるはずです。