0

我想将第一个属性 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);
    }
4

1 回答 1

0

问题是 JSTL<c:set>是视图构建时间标记处理程序,而不是视图渲染时间UI 组件,因此您的问题是一个经典问题:当您期望它设置值时,它不再存在于组件树中。此外,它在根本没有<h:selectOneMenu>标签的情况下运行。

当然,如果实现<h:selectOneMenu>ActionSource,就像在. 但你不能那样做。<h:commandButton><f:setPropertyActionListener><f:setPropertyActionListener target="#{contactMB.refContt}" value="#{reclamationMB.refCont}">

基本上你可以做两件事:

  1. 使用 PrimeFaces<p:remoteCommand>标签,它可以持有上述动作监听器来设置需要的值,并在onchange方法中调用它。在 Stack Overflow 和优秀的 PrimeFaces 文档中有很多这样的例子。
  2. 使用 bean 注入,而不仅仅是 bean 属性注入。在前一种情况下,表达式reclamationMB.getRefCont()将始终在持有者 bean 中产生正确的结果,前提是它reclamationMB是保存注入 bean 的变量@ManagedProperty
于 2013-05-05T16:17:12.787 回答