如果在表单上将'required'设置为'true'的空元素,是否有人可以告诉我如何自动设置<h:selectOneMenu>
(或任何其他组件)的值取决于另一个<h:selectOneMenu>
?如果要设置<a4j:support event="onchange" reRender="anotherElement" immediate="true" />
,则不会更改任何内容,因为未设置更改的值。但是没有immediate="true"
我总是有消息说这个或那个元素不能为空。这是不起作用的代码示例。
<h:outputLabel value="* #{msg.someField}: "/>
<h:panelGrid cellpadding="0" cellspacing="0">
<h:selectOneMenu id="someSelect"
value="#{MyBean.someObj.someId}"
required="true" label="#{msg.someField}"
>
<a4j:support event="onchange" reRender="anotherSelect" limitToList="true" immediate="true"/>
<f:selectItem itemValue=""/>
<f:selectItems value="#{MyBean.someList}"/>
</h:selectOneMenu>
<rich:message for="someSelect" styleClass="redOne"/>
</h:panelGrid>
<h:outputLabel value="* #{msg.anotherField}: "/>
<h:panelGrid cellpadding="0" cellspacing="0">
<h:selectOneMenu id="anotherSelect"
value="#{MyBean.someObj.anotherId}"
required="true" label="#{msg.anotherField}"
>
<f:selectItem itemValue=""/>
<f:selectItems value="#{MyBean.anotherList}"/>
</h:selectOneMenu>
<rich:message for="anotherSelect" styleClass="redOne"/>
</h:panelGrid>
<h:outputLabel value="* #{msg.name}: "/>
<h:panelGrid cellpadding="0" cellspacing="0">
<h:inputText id="myName" value="#{MyBean.someObj.myName}"
required="true" label="#{msg.name}"/>
<rich:message for="myName" styleClass="redOne"/>
</h:panelGrid>
所以,在这里(我再说一遍),如果我尝试改变'someSelect',那么'anotherSelect'应该更新它的值,但它不会,因为当它试图获得'someSelect'的值时,它变为null(如果{ {1}}设置为immediate
)或表单验证在空元素上失败。如何跳过验证,但从'someSelect'获取此更改值?
答案 0 :(得分:2)
您是否尝试将ajaxSingle="true"
添加到someSelect a4j:support元素?删除immediate="true"
答案 1 :(得分:0)
以下解决方案适用于JSF 2.0
<h:outputLabel
value="* Country: "/>
<h:selectOneMenu
id="someSelect"
value="#{testController.countryName}"
required="true">
<f:selectItem
itemLabel="Select Country"
itemValue=""/>
<f:selectItems
value="#{testController.countryNamesSelectItems}"/>
<!-- This will only update "someSelect" and repaint "anotherSelect" -->
<f:ajax
execute="@this"
render="anotherSelect"/>
</h:selectOneMenu>
<h:outputLabel
value="* State: "/>
<h:selectOneMenu
id="anotherSelect"
value="#{testController.stateName}"
required="true">
<f:selectItem
itemLabel="Select State"
itemValue=""/>
<f:selectItems
value="#{testController.stateNamesSelectItems}"/>
</h:selectOneMenu>
f:ajax调用将在“someSelect”的更改时向服务器提交ajax请求。仅发生“someSelect”组件的模型更新(因为execute =“@ this”)。在渲染响应阶段,只会重新渲染“anotherSelect”(因此使用更新的国家/地区名称调用testController.stateNamesSelectItems)。
由于所有这一切,所选国家/地区的状态将更新为国家/地区更改时... ajax方式。
希望这有帮助。