2012-06-13 83 views
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空间<窗口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(); 
    } 
} 

谢谢你的帮助。

回答

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

谢谢,@ ten2net。这就解决了我的问题,然后再来:) “按钮标签=”详细信息“/” @Listen(“onClick = listbox listitem listcell button”) – Eaton

+0

嗨@ ten2net,如果我想要在两个或更多的按钮列表框?我应该如何调用以获取特定按钮的onClick事件? – Eaton

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. 尽量不要把任何祖尔放入你的java。这是混合行为与演示。有时它是不可避免的,但总是先尝试让zul保持在zul中,然后通过java ID进行交互(很像我的建议)。这并不总是可行的,但逻辑与布局的分离是核心设计模式。

西蒙