selectBooleanCheckbox를 통한 JSF ReRender 지원
문제
클릭하면 페이지에서 특정 다른 양식 필드를 추가/제거하는 확인란을 갖고 싶은 JSF 페이지가 있습니다.현재 확인란에 대해 가지고 있는 (단순화된) 코드는 다음과 같습니다.
<h:selectBooleanCheckbox title="showComponentToReRender" value="#{backingBean.showComponentToReRender}">
<a4j:support event="onsubmit" reRender="componentToReRender" />
</h:selectBooleanCheckbox>
숨기려는 구성요소의 코드는 다음과 같습니다.
<h:selectOneMenu id="componentToReRender" value="#{backingBean.value}" rendered="#{valuesList.rowCount>1 && backingBean.showComponentToReRender}">
<s:selectItems value="#{valuesList}" var="value"/>
</h:selectOneMenu>
현재는 확인란을 클릭해도 아무런 작업이 수행되지 않습니다."selectOneMenu"는 사라지지 않을 것입니다.내가 도대체 뭘 잘못하고있는 겁니까?
해결책
포장을 하셔야 합니다 componentToReRender
다음 중 하나에서:
<h:panelGroup id="componentToReRenderWrapper">
또는
<a4j:outputPanel id="componentToReRenderWrapper">
따라서 효과적으로 다음을 갖게 됩니다.
<h:panelGroup id="componentToReRenderWrapper">
<h:selectOneMenu id="componentToReRender" value="#{backingBean.value}" rendered="#{valuesList.rowCount>1 && backingBean.showComponentToReRender}">
<s:selectItems value="#{valuesList}" var="value"/>
</h:selectOneMenu>
</h:panelGroup>
그리고 변경 reRender="componentToReRenderWrapper"
당신이 사용하는 경우 panelGroup
, 또는 해당 속성을 사용하는 경우 해당 속성을 제거하십시오. outputPanel
.
정확한 설명을 찾아보니 리치페이스 문서:
reRender 사용 시 가장 일반적인 문제는 "rendered" 속성이 있는 구성 요소를 가리키는 것입니다.JSF는 "렌더링된" 조건이 false를 반환하는 경우 구성 요소의 결과가 배치되어야 하는 브라우저 DOM의 위치를 표시하지 않습니다.따라서 Ajax 요청 중에 구성 요소가 렌더링된 후 RichFaces는 렌더링된 코드를 클라이언트에 전달하지만 업데이트 위치를 알 수 없기 때문에 페이지를 업데이트하지 않습니다."렌더링" 속성이 없는 상위 구성 요소 중 하나를 가리켜야 합니다.대안으로, 레이아웃="없음" 으로 구성 요소를 래핑할 수 있습니다.
다른 팁
A4J : outputPanel에서 ajaxrendered = "true"를 설정하는 것을 잊지 마십시오.