2012-03-29 4 views
0

Ich möchte einige Attribute an die Methode actionListener übergeben.Primefaces p: menuitem übergeben Attribute an actionListener

Meine Implementierung ist wie ...

<c:forEach items="${customerProductsBean.userProductList}" var="userProduct"> 
    <p:panel toggleable="#{true}" toggleSpeed="500" header="#{userProduct.product}" > 
     // Some Code... Data Table and Tree Table 

     <f:facet name="options"> 
      <p:menu> 
       <p:menuitem value="ProductSetup" actionListener="#{customerProductsBean.getProductSetupData}" > 
         <f:attribute name="userIdParam" value="#{data.userId}"/> 
         <f:attribute name="geCustomerIdParam" value="#{data.geCustomerId}"/> 
         <f:attribute name="acpProductParam" value="#{data.acpProduct}"/> 
       </p:menuitem> 
       <p:menuitem value="Remove Product" url="#" onclick=""/> 
      </p:menu> 
     </f:facet> 
    </p:panel> 
</c:forEach> 

Und in Java Action-Listener

public void getProductSetupData(ActionEvent actionEvent) { 
     try { 
      String userIdParam = 
    (String)actionEvent.getComponent().getAttributes().get("userIdParam"); 
      String geCustomerIdParam = 
    (String)actionEvent.getComponent().getAttributes().get("geCustomerIdParam"); 
      String acpProductParam = 
    (String)actionEvent.getComponent().getAttributes().get("acpProductParam"); 
     } catch(Exception e) { 
      // Exception 
     } 
} 

Ich versuchte es <f:attribute> und <f:param> verwenden, aber war nicht in der Lage, den Wert in Java zu erhalten.

In Java Es zeigt null für jeden Wert.

Antwort

3

Dies funktioniert nicht, wenn sich #{data} auf die Iterationsvariable einer iterierenden JSF-Komponente wie <h:dataTable var> bezieht. Die <f:attribute> wird während der Buildzeit der JSF-Ansicht festgelegt, nicht während der Renderzeit der JSF-Ansicht. Die <h:dataTable var> ist jedoch während der Erstellung der Ansicht nicht verfügbar. Sie ist nur während der Renderzeit der Ansicht verfügbar.

Wenn Ihre Umgebung unterstützt EL 2.2, stattdessen tun

<p:menuitem ... actionListener="#{customerProductsBean.getProductSetupData(data)}" /> 

mit

public void getProductSetupData(Data data) { 
    // ... 
} 

Oder wenn Ihre Umgebung nicht, stattdessen tun

public void getProductSetupData(ActionEvent event) { 
    FacesContext context = FacesContext.getCurrentInstance(); 
    Data data = context.getApplication().evaluateExpressionGet(context, "#{data}", Data.class); 
    // ... 
} 
+0

Heya BalusC ... Dank für die Antwort .... Problem wurde gelöst. Tatsächlich war # {data} nicht verfügbar. –