Как установить раскрывающийся список со значениями в зависимости от другого раскрывающегося списка, если для обоих заданы обязательные параметры - PullRequest
4 голосов
/ 03 июня 2010

Может кто-нибудь сказать мне, как автоматически установить <h:selectOneMenu> (или любой другой компонент) со значениями, зависящими от другого <h:selectOneMenu>, если в форме есть пустые элементы с «required», установленным в «true»? Если установить <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', он получает нулевое значение (если 1008 * установлен на true) или проверка формы завершается неудачно на пустых элементах. Как я могу пропустить проверку, но получить это измененное значение из 'someSelect'?

Ответы [ 2 ]

2 голосов
/ 03 июня 2010

Вы пытались добавить ajaxSingle="true" к элементу someSelect a4j: support? Удалить immediate="true"

0 голосов
/ 03 июня 2010

Следующее решение работает в 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 отправит запрос ajax на сервер по обмену «someSelect». Произойдет обновление модели только для компонента someSelect (из-за execute = "@ this"). На этапе ответа рендеринга будет перерисован только «anotherSelect» (таким образом вызывая testController.stateNamesSelectItems с обновленным именем страны).

В результате всего этого, состояния выбранной страны будут обновляться, как при изменении страны ... путем ajax.

Надеюсь, это поможет.

...