0

我想创建一个按钮,该按钮可以显示一个窗口,以便在单击时显示列表框中元素的详细信息。列表框 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 空间 <Window cP8Q0#userWindow> 中不是唯一的: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();
    }
}

感谢您的帮助。

4

2 回答 2

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.lang. 那就是将行为与表现相混合。有时这是不可避免的,但总是先尝试将 zul 保留在 zul 中,然后仅通过 java ID 与其交互(很像我的建议)。这并不总是可能的,但逻辑与布局的分离是一种核心设计模式。

西蒙

于 2012-06-14T21:00:03.580 回答
0
<button label="Detail" />
@Listen("onClick = listbox listitem listcell button")
于 2012-06-13T05:44:25.910 回答