我想要一种方法来轻松地将小部件绑定回它正在呈现的业务对象。因此,当用户与小部件交互时,我可以轻松确定持有该小部件数据的业务对象。
例如,如果我们想象一个日历小部件,我们将使用 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);
}
}
}