2010-06-03 4 views
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» он получает null (если immediate установлен на true) или проверка формы не выполняется при пустых элементах. Как я могу пропустить проверку, но получить это измененное значение из 'someSelect'?

ответ

2

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

+0

Да, спасибо! Это так просто :) – mykola

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> 

Диафрагменное: Ajax вызов будет отправить запрос на Ajax на сервер OnChange из "someSelect". Обновление модели только для компонента «someSelect» произойдет (из-за выполнения = «@ this»). На этапе ответа рендеринга будет повторно отображаться только «anotherSelect» (таким образом, вызывая testController.stateNamesSelectItems с обновленным именем страны).

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

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

+0

Спасибо, но я использую jsf 1.2. :) – mykola