2013-05-05 66 views
0

我想将第一个属性managedabean“refCont”的选定值存储在托管bean的第二个属性中,然后我将发布。但值会显示第二次选择后知道显示的值是第一次选择的值。我不知道什么缘故@ManagedProperty初始化

.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 

二Mnaged豆

@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

的问题是,JSTL的<c:set>是视图生成时标签处理程序,而不是一个视图nder time UI组件,所以你的问题是一个经典的问题:当你期望它设置的值,它不再存在于组件树中。此外,它完全没有<h:selectOneMenu>标签。

当然,如果<h:selectOneMenu>实施ActionSource,就像<h:commandButton>,你可以嵌套JSF <f:setPropertyActionListener>用于设置与所需的值bean的属性,如<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的变量。
+0

感谢您的解释,但我不能做第一个,因为我已经使用了<这个,我想我不能调用两个' p:remoteCommand>'在同一个onchange。 第二:我有一个错误,当我使用“bean注入”时没有找到'property =“reclamationMB.refCont”'' '' – ftning 2013-05-05 22:15:51

+0

Firast可以调用多个远程函数,但这不是必需的,可能太昂贵了。不过,您可以将''添加/嵌套到''*。至于第二个,''只运行一次,所以你*不能用它来解决你的问题。相反,*注入整个bean *来完成这项工作:'@ManagedProperty(“#{reclamationMB}”)private ReclamationMB reclamationMB;'用getters/setters,不需要其他任何东西,以防注入bean初始化*只是准时*。 – skuntsel 2013-05-06 04:54:33

+0

不错,它的工作,但在第二选择。我注入整个bean,并添加 ftning 2013-05-06 11:02:47