0

我想要一种方法来轻松地将小部​​件绑定回它正在呈现的业务对象。因此,当用户与小部件交互时,我可以轻松确定持有该小部件数据的业务对象。

例如,如果我们想象一个日历小部件,我们将使用 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);
       }
    }
}
4

1 回答 1

0

例如,如果我们看下面的代码;如果约会的标签收到点击,我如何找出它代表的应用程序?

通过使用复合模式,您可以找出单击了哪个小部件,最初您应该创建自己的自定义约会小部件,该小部件负责绘制一个约会。在您的约会小部件中,您可以拥有一组其他小部件,在您的情况下,用于标签添加点击处理程序。一旦用户单击该标签,您就可以使用其数据执行业务逻辑,并且可以表示数据。

public class Appointment extends Composite { 
      private AppointmentDetails data;
      public Appointment(AppointmentDetails data){
           draw(data);
      }

      private void draw(AppointmentDetails data){
         Label label = new Label();
         label.addClickHandler(new ClickHandler() {
         public void onClick(ClickEvent event) {
             // do your business logic with this AppointmentDetails
             }
         });
      }

}

之后,您应该有一个包含多个约会的日历小部件。请记住:您的每个类都服务于一个非常明确定义的目的,与具有其他明确定义目的的其他类分开。

于 2012-04-06T10:23:37.830 回答