2013-05-05 23 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