2010-11-18 7 views
1

私は、複数のプレゼンターを同じイベントに「聴く」ことを試みてきましたが、私は各イベントをプレゼンターにとって一意にしました。複数の接続されたgwtウィジェットのイベントを区別する

Ex。 3つのCompositeウィジェットをそれぞれ別のタブに作成します。彼らは拘束時にすべて同じイベントにアタッチされます。それを "NewPrescriptionEvent"としましょう。このイベントが発生すると、すべての3つのコンポジットはDOになります。私は彼らのうちの1人だけがそれをしたい。

これを行うための唯一の方法は、イベントに応答しようとしている各ウィジェットをチェックするtempイベントID(イベント内の整数)を作成することです。

コードは、私はいつものを行う結合中に

private class OnNewPrescription implements NewPrescriptionHandler { 

    @Override 
    public void onNewPrescription(NewPrescriptionEvent event, int dataObjectId) { 

     if (getDataObject().getPatientId() == dataObjectId) { 
     ... 
     } 
    } 
} 

スニペット:

eventBus.addHandler(NewPrescriptionEvent.TYPE, new OnNewPrescription()); 

イベント:私はTYPEはそれぞれ異なる必要があることを考えていた

public class NewPrescriptionEvent extends GwtEvent<NewPrescriptionHandler> { 

    public static final GwtEvent.Type<NewPrescriptionHandler> TYPE = new GwtEvent.Type<NewPrescriptionHandler>(); 

    private int dataObjectId; 

    public NewPrescriptionEvent(int dataObjectId) { 
     this.dataObjectId = dataObjectId; 
    } 

    @Override 
    protected void dispatch(NewPrescriptionHandler handler) { 
     handler.onNewPrescription(this, dataObjectId);  
    } 

    @Override 
    public GwtEvent.Type<NewPrescriptionHandler> getAssociatedType() { 
     return TYPE; 
    } 
} 

それでも同じイベントになります。誰にでも提案はありますか?

Thx。

+0

イベントシステムを使用してクライアント側の処理をスケジュールしていますか?イベントを処理するために_something_が必要な場合は、処理をトリガーするイベントだけをリッスンする別のウィジェットを作成します。イベントを処理する予定のないウィジェットにイベントハンドラを追加する場合は、何か不思議です。たぶん、もっと多くのイベントタイプが必要かもしれません。 –

+0

同じイベントを使用し、3つのハンドラのうちの1つだけが実際に何かをしたい場合は、イベントで渡された変数を使用します。あなたのサンプルコードはいくらか混乱しているようです。あなたはこの問題を解決するための他の提案を探しているのですか?あるいはあなたのコードを修正する助けが必要ですか? – dagge

答えて

2

同じプレゼンターの任意の数のインスタンスを持ち、すべて同じイベントタイプをリッスンしている場合はありますか?あなたのプレゼンターのそれぞれが別のエンティティをコントロールしているため、そのエンティティからのイベントにのみ反応する必要がありますか?その場合、私が見る唯一の解決策は、あなたが行ったようにイベントをパラメトリックにすることです。

+2

アサーションが正しいと仮定すると、これは正しい答えです:同じウィジェットタイプの複数のインスタンス。 –

0

質問のタイトルはあなたの答えと思います。

ウィジェットごとに異なるイベントタイプが必要です。

1

おそらくEventBusのようなサウンドはここでは最適なアプローチではありません。これは私が個人的に持っていた主な問題の1つですEventBus:すべてのイベントはグローバルであり、特定のタイプのさまざまなイベントを区別することは困難です。共有EventBusずに非同期イベント処理のための規則の

良いセットは次のとおりです。

  • は、直接メソッド呼び出しを経由して子ウィジェットと通信します。
  • コールバック/ハンドラ/リスナーを介して親ウィジェットと通信します。
  • ので(おそらくここでのポイントの横に)

をウィジェット兄弟の直接的な知識を避け、3つのタブが呼び出され、各タブへのコールバックを添付することができます含まれているウィジェットは、その適切なイベントハンドラに、各イベントを送出します(発表者、あなたのケースでは、私は信じています)。

ソースまたは宛先の知識はなく、イベントタイプは1つだけ、再利用可能なタブウィジェットタイプは1つ、タブクラスはシンプルなままです。原則として、ValueChangeHandlerCheckBoxに追加することとあまり変わりはない(結局のところ、イベントバス経由のチェックボックスイベントを購読していないので、ハンドラを直接ウィジェットに追加するだけです)。

ラフスケッチ:

public class TabContainer implements IsWidget { 
    public TabContainer() { 
    tab1.addNewPrescriptionHandler(
     new NewPrescriptionEventHandler() { 
      @Override 
      public void handleNewPrescriptionEvent(NewPrescriptionEvent event) { 
      handleTab1Event(event); 
      } 
     }); 
    tab2.addNewPrescriptionHandler(
     new NewPrescriptionEventHandler() { 
      @Override 
      public void handleNewPrescriptionEvent(NewPrescriptionEvent event) { 
      handleTab2Event(event); 
      } 
     }); 
    ... 
    } 
} 

そして、あなたはさらにいくつかのループとペアリングしているを簡素化することができるかもしれません。

このコンテナは、同じ原則を使用している他の場所からイベントを別の方法で返信することもできます。ウィジェットはどこからでも送信できます。

また、Eventクラスに含まれるものによっては、Eventクラスも必要ない場合もあります。必要に応じてコールバックとパラメータを定義することができます。

関連する問題