【发布时间】:2016-01-08 19:20:32
【问题描述】:
我正在尝试创建一个用于创建对象和更新对象的对话框。因此,如果我碰巧点击“新建”按钮,我将看到一个对话框,其中包含要填充的空字段,或者如果我点击条目的编辑按钮,该条目的数据将显示在对话框中以供更新。
按照 5.2 版 primefaces 展示中的示例,我可以以只读的 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() 方法评估所选客人是否为 null,如果不为 null,则返回 true。 selectedGuest 应该在单击 commandButton 时设置,以便对话框可以检索对象,但是,对于 selectedGuest 的 get/set 中的跟踪器,我没有看到使用上述 sn-p 调用的 setter。如果我删除了inputText,那么即使hasSelected 仍然返回false,因此'New Guest' 是对话框的标题,outputText 会填充一个值。
我发现这篇很棒的帖子讨论了关于动作、动作监听器等的执行顺序,但不要认为这完全是我的问题:Differences between action and actionListener。
所以最终的问题是,当我只有一个 outputText 时,为什么我的 setter 会被命令按钮调用,但使用 inputText,我从未在日志中看到它被调用?
感谢任何人提供的时间和帮助。
【问题讨论】:
-
value="#{guestList.hasSelected() ? '' : guestList.selectedGuest.name}"在编辑期间该值将为空,因为它没有连接到任何字段。 -
@Geinmachi,我不认为我在听你说的话。但是,我确实注意到,您指出的 sn-p 应该交换表达式的结果,即
#{guestList.hasSelected() ? guestList.selectedGuest.name : ''}。原来的逻辑是颠倒的。即使进行了此更改,setPropertyActionListener也不会像在对话框中没有inputText那样被触发。 -
我刚刚指出您在
inputText中有空值。如果它是空的,那么它为什么存在?无论如何,您将无法对它做任何事情。如果你在那里输入一些东西,它不会被保存,因为值没有绑定到任何 bean。也许这会导致一些错误并停止进一步处理,如果您有任何错误,请检查服务器日志,例如javax.faces.component.UpdateModelException: javax.el.PropertyNotWritableException: -
听起来你说我应该有:
value="#{guestList.selectedGuest.name}"?我已经尝试过了,但这似乎没有帮助。目前我在想我会通过 null 来区分“新”和“编辑”,但这似乎是你所说的不好的方法。至于日志,我只看到跟踪器,我的 get 返回 null,没有异常。使用我的新值 =“...” 引发此异常:javax.el.PropertyNotFoundException: /index.xhtml @78,103 value="#{guestList.selectedGuest.name}": Target Unreachable, 'null' returned null。意味着集合没有发生。 -
在添加按钮的操作方法中使用
new Guest()创建一个空的selectedGuest实例?您原本打算如何收集/转换/验证提交的值?
标签: jsf primefaces dialog master-detail