我想要一种方法来轻松地将小部件绑定回它正在呈现的业务对象。因此,当用户与小部件交互时,我可以轻松确定持有该小部件数据的业务对象。
例如,如果我们想象一个日历小部件,我们将使用 AbsolutePanel 来实现。对于每个 appt 对象,我们将为日历添加一个标签。然后,当用户单击标签时,他可以更新应用程序。所以我需要知道 label 指的是哪个 appt 对象。
例如,如果我们看下面的代码;如果约会的标签收到点击,我如何找出它代表的应用程序?我能看到的唯一解决方案是为 Label 创建一个 ApptLabel 子类,该子类将包含对其 appt 的引用。这很好,但该示例说明了一个更普遍的需求,即将小部件与数据对象相关联;然而,这意味着在视图中存在的每个对象都需要子类化一个小部件。这似乎很重 - 我希望在框架中找到一些东西,例如我可以设置为对象键的小部件中的字符串属性
我尝试过的其他方法;维护 Map 的地图——这不起作用,因为我创建的标签对象似乎不一样(就 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 extends Composite { AbsolutePanel m_panel = new AbsolutePanel(); m_panel.setStylePrimaryName("日历"); m_panel.setPixelSize(宽度,高度);
    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);
       }
    }
}