Jsf 可更新复合组件?

Jsf 可更新复合组件?,jsf,primefaces,components,composite,Jsf,Primefaces,Components,Composite,我有一个复合组件的问题 该组件使用接口声明的componentType属性将组件(及其属性)绑定到支持bean 只要复合零部件属性未更新,此操作就可以正常工作 当我仔细查看日志时,似乎备份bean属性总是使用属性的初始值进行更新 我的xhtml组件看起来像: <composite:interface componentType="timelineMandats"> <composite:attribute name="augmentedSen" type="fr.sen

我有一个复合组件的问题

该组件使用接口声明的componentType属性将组件(及其属性)绑定到支持bean

只要复合零部件属性未更新,此操作就可以正常工作

当我仔细查看日志时,似乎备份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>
其基类派生自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"/>

)

我还使用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
  • 尾波1.0.5
  • 单程证1.1.3

我已经检查了这个问题,您需要做的是使用StateHelper方法将属性实现到组件类中,否则属性将无法保存和恢复

看看:

在那里,你将看到如何做到这一点。但我认为在您的情况下,根本不需要在组件中实现augmentedSen属性,而是使用存储的ValueExpression来找到正确的bean。如果“augementedSen”是复合组件的“附加对象”,类似于转换器、验证器或行为,那么将其实现到组件类中是有意义的

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