2012-04-06 28 views
0

我想要一種輕鬆地將小部​​件綁定到其呈現的業務對象的方法。因此,當用戶與小部件交互時,我可以輕鬆確定持有該小部件數據的業務對象。GWT - 如何將業務對象與小部件相關聯

例如,如果我們想象一個日曆小部件,我們將使用AbsolutePanel實現。對於每個appt對象,我們都會在日曆中添加一個標籤。然後,當用戶點擊標籤時,他可以更新該應用。所以我需要知道標籤引用哪個appt對象。

例如,如果我們看下面的代碼;如果預約的標籤收到點擊,我怎麼知道它代表的是哪個appt?我能看到的唯一解決方案就是爲Label創建一個ApptLabel子類,它將持有對其應用的引用。這很好,但是這個例子說明了一個更常見的需求,即將小部件與數據對象相關聯;然而,這意味着每個在視圖中存在的對象都需要繼承一個小部件。看起來很重 - 我期望在框架中找到一些東西,例如一個小部件中的字符串屬性,我可以設置爲一個對象鍵

我試過的其他方法;保持地圖地圖 - 這沒有工作作爲標籤對象創建犯規似乎是相同的(在我猜的Object.Equals而言就是HashMap中使用)

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); 
     } 
    } 
} 

理想我能做些什麼像這樣 類WidgetCalendar擴展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.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你可以找出點擊了哪個部件,最初應該創建自己的自定義窗口小部件委任其負責繪製一個約會。在Appointment小部件中,您可以擁有一組其他小部件,就您的情況而言,您可以爲Label添加點擊處理程序。一旦用戶點擊該標籤,您就可以使用其數據執行業務邏輯,並且可以表示數據。

之後,你應該有一個日曆小部件,其中包含幾個約會。 請牢記:您的課程每個都有一個明確定義的單一目的,與其他課程以其他明確定義的目的分開。

+0

當然..我同意這個作品 - 我確實在我的問題中包含這種模式。我正在尋找更輕的重量.. – dancl 2012-04-06 11:36:33

相關問題