我有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}"
的内容来检查所有字段,但我不知道只检查一个字段的方法。
答案 0 :(得分:1)
如果UIInput
组件在验证阶段投出ValidatorException
,则JSF会自动使用false
调用UIInput#setValid()
。这意味着您可以在视图中使用UIInput#isValid()
来检查特定组件是否已通过验证。
您可以使用binding
属性将UIInput
组件绑定到视图,然后以通常的EL方式访问其所有属性。
<h:selectOneListbox id="first" binding="#{first}" ... required="true">
...
<a4j:ajax listener="#{myController.anotherMethodINeed}" render="secondGroup" />
</h:selectOneListbox>
<h:panelGroup id="secondGroup">
<h:panelGroup id="secondGroupCheck" rendered="#{not empty model.first and first.valid}">
...
</h:panelGroup>
</h:panelGroup>
顺便说一下,layout="none"
是<h:panelGroup>
的无效属性,所以我省略了它。此外,event="valueChange"
是<a4j|f:ajax>
内部UIInput
组件的默认值,因此我省略了它。