2012-06-13 11 views
0

복합 구성 요소에 문제가 있습니다.업데이트 가능한 복합 구성 요소?

이 구성 요소는 인터페이스 선언의 componentType 속성을 사용하여 구성 요소 (및 해당 속성)를 백업 빈에 바인딩합니다.

복합 컴포넌트 속성이 업데이트되지 않는 한 작동합니다.

로그를 자세히 보면 뒷받침 빈 속성은 항상 속성의 초기 값으로 업데이트됩니다.

내 XHTML의 구성 요소는 다음과 같습니다

@FacesComponent("timelineMandats") 
public class TimelineMandats extends TimelineBase { 

AugmentedSen asen; 

public AugmentedSen getAugmentedSen() { return asen; } 
public void setAugmentedSen(AugmentedSen asen) { this.asen = asen; } 
// other accessors and stuff 
} 

그것의 기본 클래스 UIComponentBase에서 파생 및 확장 NamingContainer :

<composite:interface componentType="timelineMandats"> 
    <composite:attribute name="augmentedSen" type="fr.senat.beans.AugmentedSen" required="true"/> 
    <composite:attribute name="timelineWidth" required="false" default="800"/> 
    <composite:attribute name="dateMin" required="false" type="java.util.Date"/> 
    <composite:attribute name="dateMax" required="false" type="java.util.Date"/> 
    <composite:attribute name="highlightDate" required="false" type="java.util.Date"/> 
    <composite:attribute name="forceMinMax" required="false" default="false"/> 
    </composite:interface> 
    <composite:implementation> 
<p:outputPanel> 
    <p:scrollPanel style="width:820px; height:200px;text-align:center;"> 
     <p:graphicImage id="imgTimeline" value="#{cc.timelineSenatoriaux}"/> 
    </p:scrollPanel> 
    <p:panelGrid columns="4"> 
     <h:outputText value="Intervalle :"/> 

     <p:calendar value="#{cc.dateMin}" pattern="dd/MM/yyyy" mode="popup" showOn="button"> 
    <p:ajax event="dateSelect" update="imgTimeline"/> 
    <p:ajax event="change" update="imgTimeline"/> 
     </p:calendar> 

     <p:calendar value="#{cc.dateMax}" pattern="dd/MM/yyyy" mode="popup" showOn="button"> 
    <p:ajax event="dateSelect" update="imgTimeline"/> 
    <p:ajax event="change" update="imgTimeline"/> 
     </p:calendar> 

     <p:commandButton value="Mettre à jour" update="imgTimeline"/> 
    </p:panelGrid> 
</p:outputPanel> 
    </composite:implementation> 

백킹 빈은 같은 선언

public class TimelineBase extends UIComponentBase implements Serializable,NamingContainer { 
... 
} 

나는 또한 UINamingContainer, UIComponent 등에서 도출하려고했습니다.

"AugmentedSen"유형은 직렬화가 가능하며 다른 많은 장소에서 사용됩니다.

복합 구성 요소는 몇 가지 매개 변수로 엘 식으로 호출됩니다

<sen:timelineMandatsSenateurs augmentedSen="#{selectionContext.selectedSen}" timelineWidth="700" forceMinMax="true"/> 

내가 제대로 설정 속성 로그에 볼 수 있지만 결코 설정되지 값이 엘 식의 결과에 따라 변경 있음 평가. selectedSen의 값은 사용자가 다른 구성 요소의 항목을 선택할 때 변경됩니다.

인터페이스 선언의 componentType 특성을 제거하고 cc.attrs.augmentedSen 값을 출력하면 올바르게 업데이트된다는 점이 놀랍습니다. Backing Bean의 인스턴스가 하나만 존재한다는 것을 이해할 수 있습니다. 하지만 속성이 제대로 업데이트되지 않는 이유는 무엇입니까?

나는 (

<sen:timelineMandatsSenateurs id="tl_#{selectionContext.selectedSen.sen.senmat}" augmentedSen="#{selectionContext.selectedSen}" timelineWidth="700" forceMinMax="true"/> 

같은 것을) 복합 구성 요소 인스턴스를 파라 메트릭 ID를 제공함으로써 chead하려고 노력했다.

필자는 또한 그것을 primefaces p : outputPanel in dynamic = "true"로 캡슐화하고, 매개 변수가 null이 아닌 경우에만 렌더링되지만 아무 것도 변경하지 않습니다. 매개 변수로 전달 된 EL 표현식이 재평가되고 속성이 제대로 업데이트되도록

<p:outputPanel id="graph" dynamic="true" rendered="#{not empty selectionContext.selectedSen}"> 
    <sen:timelineMandatsSenateurs augmentedSen="#{selectionContext.selectedSen}" timelineWidth="700" forceMinMax="true"/> 
</p:outputPanel> 

그래서 어떻게 넣을 수 있습니까?

미리 감사드립니다.

내가 사용하고 있습니다 :

  • 바람둥이 6.0.33
  • 에서 MyFaces 2.1.7
  • PrimeFaces 3.2
  • CODI 1.0.5 OWB 1.1.3

답변

0

나는이 문제를 확인하고 당신이해야 할 것은 StateHelper 방법을 사용하여 구성 요소 클래스로 속성을 구현하는 것입니다있다가, 그렇지 않으면 속성이 저장 및 복원되지 않습니다.

를 살펴 보자이

http://svn.apache.org/repos/asf/myfaces/core/trunk/api/src/main/java/javax/faces/component/UIOutput.java

을, 당신은 그것을 수행하는 방법을 볼 수 있습니다. 하지만 난 당신의 경우에는 전혀 구성 요소에 augmentedSen 속성을 구현할 필요가 없다고 생각하고 대신 저장된 ValueExpression을 사용하여 올바른 빈을 찾습니다. "augementedSen"이 변환기 또는 유효성 검사기 또는 동작과 유사하게 복합 구성 요소의 "첨부 된 객체"인 경우 구성 요소 클래스에이를 구현하는 것이 좋습니다.

관련 문제