2010-05-11 6 views
0

Seam에서 webapp을 만들고 있지만 수정할 수없는 문제가 발생했습니다.a4j reRender 후에 Seam Bean으로 전달 된 폼 값이 없습니다.

고객이 콤보 상자를 통해 예약 유형을 선택할 수있는 JSF 형식을 가지고 있습니다. 선택한 값에 따라 다른 양식 구성 요소가 렌더링됩니다.

예 : 고객이 예약 유형으로 시간을 선택하면 고객이 시작 시간과 종료 시간을 선택할 수있는 위치에서 panelGroup이 렌더링됩니다. 그러나 고객이 예약 유형으로 '오늘의 일부'를 선택하면 고객이 하루 중 일부 (오전, 오후, 저녁)를 선택할 수있는 곳에서 selectOneMenu가 렌더링됩니다.

다시 렌더링 할 수 있지만 구성 요소의 값 렌더링 된 조건부를 가진 객체는 빈에 전달되지 않습니다. 그들은 null 값을 유지합니다.

<s:div id="spot" 
     rendered="#{selectedProduct.productType.name eq 'Flex Spot'}"> 

    <h:panelGrid columns="2"> 
     <h:outputText value="Reservation Type" /> 
     <h:selectOneMenu value="#{selectedPeriodPart}"> 
      <s:selectItems 
       value="#{productManager.getAvailableDayPartsSpot()}" 
       var="daypart" 
       label="#{daypart.label}"></s:selectItems> 
      <s:convertEnum /> 

      <a4j:support ajaxSingle="true" 
         event="onchange" 
         action="#" 
         reRender="spot"> 
      </a4j:support> 
     </h:selectOneMenu> 

     <h:outputText id="date_spot" value="Date" /> 

     <a4j:outputPanel id="calendar_spot" layout="block"> 
      <rich:calendar value="#{reservation.reservationPeriod.startDate}" 
          locale="en" cellWidth="24px" 
          cellHeight="22px" 
          style="width:200px" /> 
     </a4j:outputPanel> 

     <h:outputText rendered="#{selectedPeriodPart eq 'DAY_PART'}" 
         value="Daypart" /> 

     <h:selectOneMenu value="#{selectedDaypart}" 
         rendered="#{selectedPeriodPart eq 'DAY_PART'}"> 
      <f:selectItem id="si_morning" itemLabel="Morning (6:00 - 12:00)" 
          itemValue="morning" /> 
      <f:selectItem id="si_afternoon" 
          itemLabel="Afternoon (12:00 - 18:00)" itemValue="afternoon" /> 
      <f:selectItem id="si_evening" itemLabel="Evening (18:00 - 00:00)" 
          itemValue="evening" /> 
     </h:selectOneMenu> 

     <h:outputText rendered="#{selectedPeriodPart eq 'HOURS'}" 
         value="Hours" /> 

     <h:panelGroup id="hours_spot" 
         rendered="#{selectedPeriodPart eq 'HOURS'}"> 
      <ui:include src="/includes/reservation/select_hours.xhtml" /> 
     </h:panelGroup> 
    </h:panelGrid> 
</s:div> 

참고 :

내가 이야기하고있는 코드입니다 달력 값이 빈에 다시 전달합니까하지만이 코드 조각의 값이하지 않습니다 (당신은 제거 않을 경우) 렌더링 된 조건은 :

selectOneMenu value="#{selectedDaypart}" rendered="#{selectedPeriodPart eq 'DAY_PART'}" 

답변

0

내가 수정했습니다 .- 게시 한 코드에 아무런 문제가 없었습니다. 이 문제를 해결할 수 없어서 같은 대화에서 다른 페이지로 계속했습니다. 나는 좀 이상한 행동을 알아 냈다 : 변수의 추론이 작동하지 않았다.

코드의 다른 부분에 오류가있는 것으로 생각하여 문제를 해결했다.

답장을 보내 주신 Thx! 그것은 = ( 분명 몇 가지를 만들려면 : 백킹 빈은 상태 유지 세션 빈 (EJB입니다) 내 문제가 해결되지 않음) = 질문에 대답하기위한

0

당신은 rendered 속성의 결과에 대한 책임이있는 조건문도 양식 제출을의 후속 요청에서 동일한 지 확인해야합니다. 구성 요소가 렌더링되지 않을 때 JSF는 요청 값을 적용하지 않기 때문에

요약하면 #{selectedPeriodPart} 뒤의 속성은 이후 요청에서 동일해야합니다. 몇 가지 해결책이 있습니다 :

  1. 빈을 세션 범위에 넣으십시오. 가장 쉬운 솔루션이지만 서버 메모리 및 클라이언트 환경에 좋지 않습니다 (업데이트는 동일한 세션의 여러 탭/창에 반영됩니다).

  2. <h:inputHidden>을 통해 전달하십시오. 이것이 Ajax/Richfaces 그림에 어떻게 맞는지는 확실하지 않습니다. 더 나은 사용 <a4j:keepAlive> 여기.

  3. 대화 범위를 사용하십시오. Seam은이를위한 기능을 제공합니다.

+0

감사합니다. 대화의 범위와 난에 selectOneMenu value="#{selectedDaypart}" 포장 시도 a a4j:outputPanel 그리고 해당 구성 요소에 렌더링 된 조건부를 넣었습니다. 그러나 이것은 작동하지 않았습니다. – Casper

+0

죄송합니다. 단지 디버거를 실행하라는 제안 이외에는 도움이되지 않습니다.적어도, 문제의 원인과 해결 방법을 찾아야한다 : 문제의 컴포넌트의'rendered' 애트리뷰트가 후속 요청에서'false'로 평가되지 않도록하십시오. – BalusC

관련 문제