2012-06-13 47 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進行交互(很像我的建議)。這並不總是可行的,但邏輯與佈局的分離是核心設計模式。

西蒙