Я пытаюсь создать диалог, который будет служить как для создания объектов, так и для их обновления. Поэтому, если мне удастся нажать кнопку "новый", мне будет представлено диалоговое окно, содержащее пустые поля для заполнения, или если я нажму кнопку редактирования для записи, эти данные ввода будут представлены в диалоговом окне для обновления.
Следуя примеру в витрине штрихов для версии 5.2, я могу представить данные в форме только для чтения в формате OutputText, однако, когда я меняю ее на inputText, поле остается пустым. Следующий код является примером того, что у меня есть:
<h:form id="form">
<p:dataGrid id="guestList" var="guest" value="${guestList.guests}" columns="3" paginator="true" rows="20">
<f:facet name="header">
Guest List
</f:facet>
<p:panel>
<h:outputText value="${guest.name}" />
<br />
<h:outputText value="${guest.street}" />
<br />
<h:outputText rendered="#{guest.street2.length() gt 0}"
value="${guest.street2}" />
<h:panelGroup rendered="#{guest.street2.length() gt 0}">
<br />
</h:panelGroup>
<h:outputText value="${guest.city}, " />
<h:outputText value="${guest.state} " />
<h:outputText value="${guest.zipCode}" />
<p:commandButton update="@form:newGuestDetail" oncomplete="PF('newGuestDialog').show()" icon="ui-icon-edit" styleClass="ui-btn-inline">
<h:outputText styleClass="ui-icon ui-icon-edit" style="margin:0 auto;" />
<f:setPropertyActionListener value="#{guest}" target="#{guestList.selectedGuest}" />
</p:commandButton>
</p:panel>
</p:dataGrid>
<p:dialog header="#{guestList.hasSelected() ? 'Edit Guest' : 'New Guest'}" widgetVar="newGuestDialog" modal="true" showEffect="fade" hideEffect="fade">
<p:outputPanel id="newGuestDetail">
<h:outputText value="'#{guestList.selectedGuest.name}'"/>
<p:inputText id="guestName" value="#{guestList.hasSelected() ? '' : guestList.selectedGuest.name}" pt:placeholder="Name"/>
<p:commandButton value="#{guestList.selectedGuest == null ? 'Create Guest' : 'Update Guest'}"/>
</p:outputPanel>
</p:dialog>
</h:form>
Метод hasSelected() оценивает, является ли выбранный гость нулевым или нет, возвращает true, если не null. ВыбранныйGuest должен быть установлен при нажатии кнопки commandButton, чтобы объект был доступен для извлечения по диалогу, однако с трассировщиками в get/set для selectedGuest, я не вижу вызывающего устройства с указанным выше фрагментом. Если я удалю inputText
, то даже если hasSelected
все еще возвращает false, и, таким образом, "Новый Гость" загорается диалоговым окном, значение outputText
заполняется значением.
Я нашел этот отличный пост, рассказывающий о порядке исполнения в отношении действия, прослушивателя действий и т.д., но не думаю, что это довольно моя проблема: Различия между действием и ActionListener.
Итак, конечный вопрос в том, почему мой сеттер вызывается с помощью кнопки команды, когда у меня есть только выходной текст, но с inputText, я никогда не вижу его вызванного в журнале?
Я ценю время и помощь, которую каждый может предоставить.