2010-06-03 2 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> 

, 여기 (I 반복), 나는 그것의 값을 업데이트해야합니다 'someSelect'다음 'anotherSelect'을 변경하려고하지만 않는 경우 때문이 아니라 중 하나는 'someSelect'가 도착의 가치를하려고 할 때 null (immediatetrue으로 설정된 경우) 또는 빈 요소에서 양식 유효성 검사가 실패합니다. 유효성 검사를 건너 뛰어도이 'someSelect'에서 변경된 값을 얻으려면 어떻게해야합니까?

답변

2

someSelect a4j : support 요소에 ajaxSingle="true"을 추가 했습니까? 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> 

은 F에서 작동 제거 아약스 호출은 "someSelect"의 onchange를 서버에 Ajax 요청을 제출합니다. "someSelect"구성 요소에 대한 모델 업데이트가 발생합니다 (execute = "@ this"로 인해). 렌더링 응답 단계에서는 "anotherSelect"만 다시 렌더링되므로 업데이트 된 국가 이름이있는 testController.stateNamesSelectItems가 호출됩니다.

이 결과로 선택한 국가의 상태는 국가가 변경되면 ... 아약스 방식으로 업데이트됩니다.

희망이 도움이됩니다.

+0

고맙습니다 만, jsf 1.2를 사용합니다. :) – mykola

관련 문제