1

我对 ZK 框架非常陌生,并尝试自定义一些东西,并且有一点我不知道如何实现这一点。

我有一个预定义的部分,我需要在其中显示 2 个下拉菜单和一个按钮,并且需要在按钮单击事件上保留这些下拉值。这就是它在 Spring 文件中的定义方式

<bean id="mybean" parent="parentBean" class="WidgetRenderer">
   <property name="detailRenderer">
            <bean class="DetailsListRenderer" parent="abstractWidgetDetailRenderer"/>
   </property>
</bean>

这里mybean用于显示主要部分,我正在使用此 bean 添加我的下拉菜单,同时将按钮添加到detailRenderer.

保存按钮绑定到onClick事件,但我不确定如何从自定义下拉列表中获取值?我知道将那些DropdownonClick事件绑定,但他们必须在同一个班级。

任何人都可以建议我如何获取这些下拉列表的值。我正在使用以下代码创建下来

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

2 回答 2

2

您可能想听听onSelect(我更喜欢使用Events.ON_SELECT而不是编写字符串),它更具体到Listbox选择何时更改。

Event无论哪种方式,关键是从传递给您的信息中获取您想要的信息EventListener,而不是返回您Listbox自己。基本的Event通常带有有用的信息getTargetgetData但使用更具体的事件(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 小部件的事件。

于 2014-01-09T13:59:52.040 回答
1

如果我理解了这个问题(我认为我在之前的回复中没有这样做),那么您希望Listbox在用户单击按钮时从页面中收集信息(例如:选择状态)。Component您的问题是您使用不同的类来组成页面,因此在单击按钮时无法访问各种 ZK 。

(暂时忽略多类问题)
从高层次上看,ZK 社区有两个阵营。较新的 MVVM 方法建议视图应该在用户与前端交互时将相关状态推送到后端。这样,后端永远不需要询问客户端状态,并且当单击按钮时,值/状态在服务器上可供使用。

另一个阵营将客户端绑定到服务器,以便后端始终可以访问客户端Component,并且当单击按钮时,可以通过与组件交互轻松检索值/状态。

另一种方法更像我在之前的回答中所说的,根本不将后端绑定到客户端,而是尽可能地依赖事件数据。在足够的情况下,我赞成这种方法。

现在,你可以自由选择你喜欢的方法,ZK 有很多关于如何在这两个阵营中工作的文档。然后的问题是客户端状态存储在服务器上的什么位置(或者由客户端在 MVVM 中推送到那里,或者在 MVC 中绑定到那里)。我不认为这是一个可以在这里解决的问题,这是一个软件工程挑战。我个人建议您采用标准的 ZK 模式,以免与框架保持一致。如果你真的想走你的路线,你可以Listbox像这样获取对 on the fly 的引用:

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
}
于 2014-01-10T13:23:56.250 回答