【问题标题】:GWT - How to associate a business object to a widgetGWT - 如何将业务对象关联到小部件
【发布时间】:2012-04-06 09:46:08
【问题描述】:

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

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

【问题讨论】:

    标签: gwt widget


    【解决方案1】:

    例如,如果我们看下面的代码;如果一个标签 约会收到点击,我怎样才能找到它到哪个appt 代表?

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

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

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

    【讨论】:

    • 当然..我同意这行得通——我确实在我的问题中包含了这种模式。我正在寻找更轻的东西..
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多