我对ZK框架非常陌生,尝试定制一些东西,但有一点我不确定如何实现。
我有一个预定义的部分,我需要在其中显示2个下拉列表和一个按钮,并需要在按钮单击事件中保持这些下拉列表值。这就是它在Spring文件中的定义
<bean id="mybean" parent="parentBean" class="WidgetRenderer">
<property name="detailRenderer">
<bean class="DetailsListRenderer" parent="abstractWidgetDetailRenderer"/>
</property>
</bean>
这里mybean
被用来显示主要部分,当按钮被添加到detailRenderer
时,我使用这个bean添加我的下拉菜单。
保存按钮绑定到onClick
事件,但我不确定如何从自定义下拉列表中获取值?我知道将这些Dropdown
与onClick
事件绑定,但它们必须在同一类中。
有人能建议我如何获取这些下拉列表的值吗。我正在创建向下与以下代码
Listbox listbox = new Listbox();
listbox.appendItem("item1", "item1");
listbox.appendItem("item2", "item2");
这是我在另一类中的按钮代码
protected void createUpdateStatusButton(Widget widget,Div container)
{
Button button = new Button(LabelUtils.getLabel(widget, buttonLabelName, new Object[0]));
button.setParent(container);
button.addEventListener("onClick", new EventListener()
{
public void onEvent(Event event)throws Exception
{
MyClass.this.handleSaveStatusEvent(widget, event);
}
});
}
您可能想要收听onSelect
(我更喜欢使用Events.ON_SELECT
而不是编写字符串),它更具体地用于Listbox
选择更改时。
无论哪种方式,关键是从传递给EventListener
的Event
中获得您想要的信息,而不是返回到Listbox
本身。基本的Event
通常包含关于getTarget
和getData
的有用信息,但使用更具体的事件(本例中为SelectEvent
)将使您能够访问更相关的信息。
button.addEventListener(Events.ON_SELECT, new EventListener<SelectEvent<Listitem, MyDataObject>() {
public void onEvent(SelectEvent<Listitem, MyDataObject> event) {
// Now you can access the details of the selection event..
List<Listitem> selectedItems = event.getSelectedItems();
List<MyDataObject> selectedObjects = event.getSelectedObjects();
}
});
您可以在组件参考文档中找到不同ZK小部件可用的事件。
如果我理解这个问题(我想我在以前的回答中没有理解),那么当用户单击按钮时,您希望从页面收集信息(例如:Listbox
选择状态)。您的问题是,您使用不同的类来组成页面,因此在单击按钮时无法访问各种ZKComponent
。
(暂时忽略多类问题)
从高层来看,ZK社区有两个阵营。较新的MVVM方法建议,当用户与前端交互时,视图应该将相关状态推送到后端。这样,后端就不需要询问客户端状态,当单击按钮时,值/状态就在服务器上,可以使用了。
另一个阵营将客户端绑定到服务器,以便后端始终可以访问客户端Component
s,并且当单击按钮时,可以通过与组件交互来轻松检索值/状态。
另一种方法更像我在前面的回答中所说的,即根本不将后端绑定到客户端,而是尽可能地依赖事件数据。我赞成这种方法,只要它足够。
现在,你可以自由选择你喜欢的方法,ZK有很多关于如何在这两个阵营中工作的文档。那么问题是存储在服务器上的客户端状态在哪里(要么是由MVVM中的客户端推送到那里,要么是在MVC中绑定到那里)。我认为这不是一个可以在这里解决的问题,这是一个软件工程的挑战。我个人建议您采用标准的ZK模式,这样就不会直接使用框架。如果你真的想走你的路线,你可以在飞行中获取Listbox
的参考,比如:
public class Foo {
public static final String LISTBOX_ID = "myListbox";
public void renderListbox(Component parent, MyItem items) {
Listbox listbox = new Listbox();
listbox.setId(LISTBOX_ID);
listbox.setParent(parent);
for (MyItem item : items) {
listbox.appendItem(item.getName(), item);
}
}
}
public class Bar {
@Listen(Events.ON_CLICK + " = #saveButton")
public void saveButtonClicked(Event event) {
Component saveButton = event.getTarget();
Listbox listbox = (Listbox) saveButton.getFellow(Foo.LISTBOX_ID);
Set<Listitem> selection = listbox.getSelectedItems();
// do something
}