我想将第一个属性managedabean“refCont”的选定值存储在托管bean的第二个属性中,然后我将发布。但该值将显示在第二次选择之后,知道显示的值是第一次选择的值。我不知道是什么缘故
.xhtml
<h:outputText value="* Contact" />
<h:selectOneMenu id="contact" value="#{reclamationMB.refCont}" onchange="lazyload()">
<c:set value="#{reclamationMB.refCont}" target="#{contactMB}" property="refContt" />
<f:ajax listener="#{contactMB.affichReclContact}" />
<f:selectItem itemLabel="Select One" noSelectionOption="true" itemValue="---" />
<f:selectItems value="#{contactMB.contactsClient}" noSelectionValue="" var="contact" itemValue="#{contact.refCont}" itemLabel="#{contact.nomCont}" />
<f:selectItems itemLabel="Autre" itemValue=""></f:selectItems>
</h:selectOneMenu>
第一个ManagedBean:
@RequestScoped
public class ReclamationMB extends AbstractMB implements Serializable {
private int refCont;//ref contact recuperé pour la creation de la reclamation
.....
//getter and setter
第二个豆科植物
@RequestScoped
public class ContactMB extends AbstractMB implements Serializable {
@ManagedProperty("#{reclamationMB.refCont}")
private int refContt;
.....
//getter an setter
public void affichReclContact(AjaxBehaviorEvent event){
contact=service.AffichContact(refContt);
setContact(contact);
}
答案 0 :(得分:0)
问题是JSTL的<c:set>
是一个视图构建时标记处理程序,而不是视图渲染时间 UI组件,所以你的问题是经典的一:当你期望它设置值时,它不再存在于组件树中。此外,它在没有<h:selectOneMenu>
标签的情况下运行。
当然,如果<h:selectOneMenu>
已实现ActionSource
,就像<h:commandButton>
一样,您可以嵌套JSF <f:setPropertyActionListener>
,原因是使用所需的值设置bean属性,与<f:setPropertyActionListener target="#{contactMB.refContt}" value="#{reclamationMB.refCont}">
中一样。但你不能这样做。
基本上你可以做两件事:
<p:remoteCommand>
标记,它可以容纳上述动作侦听器来设置所需的值,并以onchange
方法调用它。 Stack Overflow和PrimeFaces的优秀文档中有很多这样的例子。reclamationMB.getRefCont()
将始终在holder bean中产生正确的结果,前提是reclamationMB
是通过@ManagedProperty
保存注入的bean的变量。