当验证失败时,JSF bean通常不会更新,这在某些情况下会导致非常难看的效果,例如,当使用facet="output"
of p:inplace
时:
<h:form>
<h:panelGrid id="panel" columns="3" cellpadding="2">
<p:outputLabel value="My Field" for="myfield" />
<p:inputText id="myfield" value="#{test.myField}" required="true" />
<p:message for="myfield" />
<h:outputText value="Checkbox: " />
<p:inplace id="checkboxInplace" effect="none">
<f:facet name="output">#{test.myBooleanText}</f:facet>
<f:facet name="input">
<h:selectBooleanCheckbox value="#{test.myBoolean}" />
</f:facet>
</p:inplace>
<p:spacer />
</h:panelGrid>
<p:commandButton id="refresh" icon="ui-icon-refresh" update="panel" process="@form"/>
</h:form>
输出facet定义了inplace标签,这些标签应该是本地化的,而不是标准的:
private boolean myBoolean;
public String getMyBooleanText() {
return myBoolean ? "Ja" : "Nein";
}
但是,当验证失败时,原地输出facet显示复选框的旧值,而不是实际值。如果单击它,就会显示一个实际值。
如何解决这个问题并正确实现输出?将值提交给bean将是最好的,因为只要没有实际执行操作(由验证断言),我对客户机和服务器上的值的一致状态没有问题。
我自己还没有试过,但给我一个机会:
<p:inplace id="checkboxInplace" effect="none">
<f:facet name="output">#{test.myBoolean ? 'Ja' : 'Nein'}</f:facet>
<f:facet name="input">
<h:selectBooleanCheckbox value="#{test.myBoolean}" immediate="true">
<p:ajax update="@parent" />
<h:selectBooleanCheckbox />
</f:facet>
</p:inplace>