Jsf 可更新复合组件?
我有一个复合组件的问题 该组件使用接口声明的componentType属性将组件(及其属性)绑定到支持bean 只要复合零部件属性未更新,此操作就可以正常工作 当我仔细查看日志时,似乎备份bean属性总是使用属性的初始值进行更新 我的xhtml组件看起来像:Jsf 可更新复合组件?,jsf,primefaces,components,composite,Jsf,Primefaces,Components,Composite,我有一个复合组件的问题 该组件使用接口声明的componentType属性将组件(及其属性)绑定到支持bean 只要复合零部件属性未更新,此操作就可以正常工作 当我仔细查看日志时,似乎备份bean属性总是使用属性的初始值进行更新 我的xhtml组件看起来像: <composite:interface componentType="timelineMandats"> <composite:attribute name="augmentedSen" type="fr.sen
<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
<p:outputPanel id="graph" dynamic="true" rendered="#{not empty selectionContext.selectedSen}">
<sen:timelineMandatsSenateurs augmentedSen="#{selectionContext.selectedSen}" timelineWidth="700" forceMinMax="true"/>
</p:outputPanel>