用于从列表框行显示窗口的按钮

时间:2012-06-13 04:19:54

标签: button listbox zk

我想创建一个按钮,可以显示一个窗口,在单击列表框时显示列表框中元素的详细信息。列表框itsetf是从JSONObject列表中创建的,如下所示:

<listbox id="userListbox">
<listhead>
    <listheader laber="Action"></listheader>
    <listheader label="Id"></listheader>
    <listheader label="Name"></listheader>
    <listheader label="Address"></listheader>
    <listheader label="Phone"></listheader>
</listhead>
<listitem forEach="${userController.list}">
    <listcell>
        <button label="Detail"  id="detailButton"></button>
    </listcell>
    <listcell label="${each.id}" ></listcell>
    <listcell label="${each.name}" ></listcell>
    <listcell label="${each.address}" ></listcell>
    <listcell label="${each.phone}" ></listcell>
</listitem>
</listbox>

对于每一行(listcell),总会有一个按钮来显示详细信息。但是当我加载页面时,它无法显示包含错误消息的列表:

在ID空间中不唯一&lt;窗口cP8Q0#userWindow&gt ;: detailButton。

按钮点击时显示窗口的任何想法?这是单击按钮时的代码:

@Listen("onClick = #detailButton")
public void showModal(Event event) {
    Component comp = Executions.createComponents("/widgets/window/modal_dialog/employee_dialog.zul", null, null);

    if(comp instanceof Window) {
        ((Window)comp).doModal();
    }
}

谢谢你的帮助。

2 个答案:

答案 0 :(得分:1)

问题是,如果单击不同的按钮,则会一次又一次地运行createComponents。您的employee_dialog.zul只有在其中包含ID时才能安全地包含在页面中;如果您执行两次操作,则会创建具有相同ID的第二组组件,并且ID在给定的idSpace中应该是唯一的(请参阅ZK开发人员指南中的理论)。

此处还有其他问题:为什么要两次创建组件?为什么不保留一个,只保留一个,根据按钮点击显示和隐藏它们。这更有效率。

查看Button to Show a Window from Listbox Row,表明您可以:

<zk>
    <!-- hidden -->
    <window id="wnd" title="My Modal" visible="false" width="300px">
        <button label="close" onClick="wnd.visible = false"/>
    </window>
    <!-- click button to pop the hidden window! -->
    <button label="do it" onClick="wnd.doModal()"/>
</zk>

所以你可以使用

<include src="/widgets/window/modal_dialog/employee_dialog.zul">

将模型对话框拉到主页面的底部,只打一次。然后在代码中,您可以将数据设置到其中并执行

win1.doModal(); 

其中win1是片段中定义的模态窗口。你必须告诉模型窗口在弹出之前要显示什么,但这并不难。使用desktopScope.put(“myName”,this)使对话框的控制器/视图模型在主窗口中的控制器/视图模型可以找到它的位置注册并与之通信以将其传递给要渲染的数据。

另外两个提示。

  1. 将您的片段隐藏为/WEB-INF/zul/employee_dialog.zul,因为浏览器无法直接访问WEB-INF下的任何内容以提高安全性。
  2. 尽量不要将任何zul放入java中。这就是混合行为与表现。有时它是不可避免的,但总是先尝试将zul保留在zul中,然后通过java ID与它进行交互(很像我的建议)。它并非总是可行,但逻辑与布局的分离是核心设计模式。
  3. 西蒙

答案 1 :(得分:0)

<button label="Detail" />
@Listen("onClick = listbox listitem listcell button")