我正在使用PrimeFaces 4.0的JSF 2。
我有一个包含一些输入和验证的表单。从对话框中选择实体时,某些字段可能会自动填充。在我提交整个表单(并验证)之前选择实体时,这很好用。但是当我在验证后选择一个实体时,组件的更新不起作用。
JSF页面:
<h:form id="form">
<p:inputText id="id" value="#{bean.user.id}" required="true"
onclick="PF('usersDialog').show()" />
<p:inputText id="name" value="#{bean.user.name}" required="true"
onclick="PF('usersDialog').show()" />
<p:commandButton value="submit" action="#{bean.submit}" update=":form" />
</h:form>
<p:dialog widgetVar="usersDialog">
<h:form>
<p:dataTable value="#{bean.users}" var="user">
<p:column>
<p:commandButton value="choose" onclick="PF('usersDialog').hide()"
process="@this" action="#{bean.select(user)}" update=":form" />
</p:column>
<p:column>
<h:outputText value="#{user.name}" />
</p:column>
</p:dataTable>
</h:form>
</p:dialog>
我知道它取决于JSF生命周期,但我无法修复它。 那么在从对话框中选择新实体时,如何在验证失败后更新表单?
提前致谢。
答案 0 :(得分:8)
正是出于此目的,<p:resetInput>
component被引入(基于OmniFaces ResetInputAjaxActionListener
)。
将其嵌入命令按钮,target
设置为与命令按钮的update
属性相同的客户端ID:
<p:commandButton ... update=":form">
<p:resetInput target=":form" />
</p:commandButton>
答案 1 :(得分:0)
尝试这种方式:
<h:form id="form">
<p:panel style="width: 80%;">
<p:fieldset legend="Some User" id="costAuthUser">
<p:panelGrid columns="3">
<h:outputLabel for="costUserId">User-ID</h:outputLabel>
<p:inputText id="costUserId" onclick="PF('costAuthDialog').show()"
value="#{createCert.costAuthUser.userId }" required="true"
requiredMessage="Bitte geben Sie die UserID ein." />
<p:message for="costUserId" />
<h:outputLabel for="costLastName">Name</h:outputLabel>
<p:inputText id="costLastName"
onclick="PF('costAuthDialog').show()"
value="#{createCert.costAuthUser.lastName }" />
<!-- <p:watermark value="" for="costLastName"/> -->
<p:message for="costLastName" />
</p:panelGrid>
</p:fieldset>
<p:separator />
<p:commandButton value="submit" action="#{createCert.prepareEmail }" update=":form"/>
</p:panel>
<h:form>
<p:dialog widgetVar="costAuthDialog" resizable="false" header="Some User">
<h:form id="dialogForm">
<p:dataTable value="#{createCert.costAuthList}" var="user">
<p:column>
<p:commandButton value="choose" process="@this"
oncomplete="PF('costAuthDialog').hide()" action="#{createCert.selectCostAuth(user) }" update=":form"/>
</p:column>
<p:column headerText="Name">
<h:outputText value="#{user.lastName}" />
</p:column>
<!-- Some more -->
</p:dataTable>
</h:form>
</p:dialog>
我认为重新呈现对话框层次结构存在一些问题,这种方式对话框不会更新。
您应该使用oncomplete="PF('costAuthDialog').hide()"
代替onclick