2012-06-13 2 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.это решит мою проблему перед тем, как прийти еще :) "button label =" Detail "/" @Listen ("onClick = listbox listitem listcell button") – Eaton

+0

hi @ ten2net, как если я хочу поставить две или более кнопки в ListBox? как мне позвонить, чтобы получить событие onClick конкретной кнопки? – Eaton

1

Проблема в том, что если вы нажмете на различные кнопки, вы снова и снова запускаете createComponents. Ваш employee_dialog.zul безопасен только для включения в страницу один раз, поскольку в нем есть идентификаторы; если вы выполняете операцию дважды, вы создаете второй набор компонентов с тем же идентификатором, и идентификаторы должны быть уникальными в пределах данного 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-идентификаторов (как и мое предложение). Это не всегда возможно, но разделение логики с макетом является основным шаблоном проектирования.

Simon

Смежные вопросы