2012-04-06 11 views
0

ウィジェットをレンダリングしているビジネスオブジェクトに簡単に結びつける方法が必要です。したがって、ユーザーがウィジェットとやりとりをするときに、そのウィジェットのデータを保持するビジネスオブジェクトを簡単に判別できます。GWT - ビジネスオブジェクトをウィジェットに関連付ける方法

たとえば、AbsolutePanelで実装するカレンダーウィジェットを想像してみましょう。各apptオブジェクトに対して、カレンダーにラベルを追加します。ユーザーがラベルをクリックすると、apptを更新できます。だから私はラベルが参照するどのapptオブジェクトを知る必要があります。

たとえば、次のコードを見てみましょう。予定のラベルがクリックを受け取った場合、それがどのapptに表示されているかをどのように調べることができますか?私が見ることができる唯一の解決策は、そのapptへの参照を保持するLabel用のApptLabelサブクラスを作成することです。これは問題ありませんが、この例では、ウィジェットをデータオブジェクトに関連付けることのより一般的な必要性を示しています。これは、ビュー内に存在するすべてのオブジェクトがウィジェットをサブクラス化する必要があることを意味します。重いようです - 私はフレームワークで何かを見つけることを期待しました。私はオブジェクトキーに設定することができるウィジェットの文字列プロパティ

他のアプローチ私はしようとしました。地図のマップを維持する - 私はdoesntの作成ラベルオブジェクトとして、このdidntの仕事が表示されているのと同じであることを理想的には私が何かを行うことができます

class WidgetCalendar extends Composite { 
    AbsolutePanel m_panel = new AbsolutePanel(); 
    m_panel.setStylePrimaryName("calendar"); 
    m_panel.setPixelSize(width, height); 

    public WidgetCalendar(ArrayList<BomAppt> appts) { 
     initWidget(m_panel); 
     for (BomAppt a : appts) { 
      Label l = new Label(); 
      l.addClickHandler(new ClickHandler() { 
    public void onClick(ClickEvent event) { 
    // how do I know my BomAppt in here ?     
     } 

      m_panel.add(l, someX, someY); 
     } 
    } 
} 

(私は推測はObject.equalsの面では、HashMapのは、使用するものです)このように クラスWidgetCalendarはコンポジットを拡張します{ AbsolutePanel m_panel = new AbsolutePanel(); m_panel.setStylePrimaryName( "calendar"); m_panel.setPixelSize(width、height);

public WidgetCalendar(ArrayList<BomAppt> appts) { 
     initWidget(m_panel); 
     for (BomAppt a : appts) { 
      Label l = new Label(); 
      l.setItemData(a.getUniqueId()); 
      l.addClickHandler(new ClickHandler() { 
      public void onClick(ClickEvent event) { 
       BomAppt a = BomAppt.getApptWithId(e.getItemData()) 
      } 
      } 
      m_panel.add(l, someX, someY); 
     } 
    } 
} 

これは私がサブクラスを作成するソリューションである、これは私には重いようで、私たちは次のコードを見れば、私は、単純なもの例えば

class ApptLabel extends Label { 
    public ApptLabel(BomAppt a) { 
     m_a = a; 
    this.addClickHandler(new ClickHandler() { 
    public void onClick(ClickEvent event) { 
     m_a.doSomething(); 
      }); 
    } 

    BomAppt m_a; 
} 

class WidgetCalendar extends Composite { 
    AbsolutePanel m_panel = new AbsolutePanel(); 
    m_panel.setStylePrimaryName("calendar"); 
    m_panel.setPixelSize(width, height); 

    public WidgetCalendar(ArrayList<BomAppt> appts) { 
     initWidget(m_panel); 
     for (BomAppt a : appts) { 
      BomLabel l = new BomLabel(); 
      l.addClickHandler(new ClickHandler() { 
    public void onClick(ClickEvent event) { 
    // how do I know my BomAppt in here ?     
     } 

      m_panel.add(l, someX, someY); 
     } 
    } 
} 

答えて

0

を好みます。 アポイントのラベルにクリックがあった場合、どのアプリに表示されるのですか? Composite patternを使用することにより

あなたは最初に使用すると、1件の予定を描画するための責任がある独自のカスタム予定ウィジェットを作成する必要があり、クリックされたウィジェットを見つけることができます。あなたのAppointmentウィジェットでは、あなたのケースでは、Label add clickハンドラのための他のウィジェットのセットを持つことができます。ユーザーがラベルをクリックすると、そのデータでビジネスロジックを実行し、データを表すことができます。

その後、複数の予定を含む1つの予定表ウィジェットが必要です。 あなたのクラス:あなたのクラスは、明確に定義された目的を1つ、非常に明確に定義された目的で提供し、他のクラスとは区別されます。

+0

確かに私はこの作品に同意します - 私は実際に私の質問にこのパターンを含めました。私は何か軽い重量を探していた.. – dancl

関連する問題