2012-06-13 36 views
0

我有一個複合組件的問題。可更新複合組件?

此組件使用接口聲明的componentType屬性將組件(及其屬性)綁定到輔助bean。

只要不更新複合組件屬性,它就可以工作。

當我仔細查看日誌時,似乎backing bean屬性總是用屬性的初始值更新。

我XHTML組件的樣子:

<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> 

的支持bean可以聲明如下:

@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:

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

我也試圖從UINamingContainer,UIComponent等派生出來。

「AugmentedSen」類型是可序列化的,並在許多其他地方使用。

的複合元件被稱爲與EL表達式爲一些參數:

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

我可以在屬性設置是否正確的日誌中看到,但從來沒有設置的值與EL表達式的結果改變沿評價。 selectedSen的值隨用戶選擇另一個組件中的項目而變化。

令我驚訝的是,如果我刪除接口聲明的componentType屬性並輸出cc.attrs.augmentedSen值,則會正確更新它。我可以理解,只有一個支持bean實例存在。但爲什麼這些屬性沒有正確更新?

我試圖通過賦予複合材料組件實例的參數ID(類似

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

)到chead。

我也將它封裝在一個帶有dynamic =「true」的primefaces p:outputPanel中,只在參數不爲null時呈現,但這不會改變任何內容。

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

那麼我怎樣才能把它作爲參數傳遞的EL表達式重新評估和屬性正確更新?

非常感謝提前。

我使用:

  • 的Tomcat 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來找到合適的bean。如果「augementedSen」是複合組件的「附加對象」,類似於轉換器或驗證器或行爲,則將它實現到組件類中是有意義的。