4

谁能告诉我如何自动设置<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”的值时它会变为空(如果immediate设置为true)或表单验证在空元素上失败。如何跳过验证但从“someSelect”获取更改后的值?

4

2 回答 2

2

您是否尝试添加ajaxSingle="true"到 someSelect a4j:support 元素?去除那个immediate="true"

于 2010-06-03T16:21:07.093 回答
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 调用将向服务器 onchange 提交一个 ajax 请求“someSelect”。只有“someSelect”组件的模型更新才会发生(因为 execute="@this")。在渲染响应阶段,只会重新渲染“anotherSelect”(因此使用更新的国家名称调用 testController.stateNamesSelectItems)。

由于这一切,所选国家的状态将随着国家的变化而更新……ajax方式。

希望这可以帮助。

于 2010-06-03T16:57:37.123 回答