我的复合组件有问题。
该组件使用接口声明的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表达式并正确更新属性?
非常感谢提前。
我正在使用:
答案 0 :(得分:0)
我已经检查了问题,你需要做的是使用StateHelper方法将属性实现到组件类中,否则不会保存和恢复属性。
看看:
在那里,你会看到如何做到这一点。但我认为在您的情况下根本不需要将augmentedSen属性实现到组件中,而是使用存储的ValueExpression来查找正确的bean。如果“augementedSen”是复合组件的“附加对象”,类似于转换器或验证器或行为,则将其实现到组件类中是有意义的。