我对ZK框架非常陌生,并试图定制一些东西并且已经触及到一点,我不知道如何实现这一点。
我有一个预定义的部分,我需要显示2下拉菜单和一个按钮,需要在按钮点击事件中保留这些下拉值。 这是它在Spring文件中定义的方式
<bean id="mybean" parent="parentBean" class="WidgetRenderer">
<property name="detailRenderer">
<bean class="DetailsListRenderer" parent="abstractWidgetDetailRenderer"/>
</property>
</bean>
此处mybean
用于显示主要部分,我正在使用此bean添加下拉按钮,同时将按钮添加到detailRenderer
。
保存按钮绑定到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);
}
});
}
答案 0 :(得分:2)
您可能希望收听onSelect
(我更喜欢使用Events.ON_SELECT
而不是写字符串),这更适合Listbox
选择更改的时间。
无论哪种方式,关键是要将Event
传递给EventListener
的所需信息,而不是回到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();
}
});
您可以在Component Reference documentation中找到可用于不同ZK小部件的事件。
答案 1 :(得分:1)
如果我理解了这个问题(我不认为我在之前的回复中做过),您希望在用户点击按钮时从页面收集信息(例如:Listbox
选择状态)。您的问题是您使用不同的类来编写页面,因此在单击按钮时无法访问各种ZK Component
。
(忽略多分类问题一分钟)
从较高的层面来看,ZK社区有两个阵营。较新的MVVM方法表明,当用户与前端交互时,视图应将相关状态推送到后端。这样,后端永远不需要询问客户端状态,并且当单击该按钮时,值/状态在服务器上就可以使用了。
另一个阵营将客户端绑定到服务器,以便后端始终可以访问客户端Component
,并且当单击该按钮时,可以通过与组件交互轻松检索值/状态。
另一种方法更像是我在之前的回答中谈到的,不是将后端绑定到客户端,而是尽可能地依赖事件数据。我赞成这种方法就足够了。
现在,您可以自由选择您喜欢的方法,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
}