可更新的复合组件?

时间:2012-06-13 17:34:20

标签: jsf primefaces components composite

我的复合组件有问题。

该组件使用接口声明的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>

支持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"/>

)。

我还将它封装在一个带有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

1 个答案:

答案 0 :(得分:0)

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

看看:

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

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