我有一个h:selectOneListbox
具有属性的required="true"
. 客户端验证a4j:ajax
工作正常。
如果完成了有效的选择,则会呈现另一个面板组。
例子:
<h:selectOneListbox
....
id="first"
....
required="true"
>
<a4j:ajax event="valueChange" render="secondGroup" listener="#{myController.anotherMethodINeed}"/>
</h:selectOneListbox>
<!-- the other panel -->
<h:panelGroup id="secondGroup" layout="none">
<h:panelGroup id="secondGroupCheck" layout="none" rendered="#{not empty model.first}">
</h:panelGroup>
</h:panelGroup>
这也有效。
这是问题所在:
如果用户现在在第一个选择框上选择了一个非法值(比如一个空的),那么在客户端验证输入。因此,信息永远不会进入模型。在第一个有效输入之后,面板总是被渲染。没有办法让它再次消失,因为服务器不知道更改。
我知道的唯一解决方法是为这样的字段制作一个自定义验证器。如果需要渲染面板,验证器会设置一个标志。然后可以使用此标志来决定是否应呈现面板组。
有没有更聪明的方法来做到这一点?
我知道我可以使用类似rendered="#{not facesContext.validationFailed}"
检查所有字段的方法,但我不知道只检查一个字段的方法。