2012-03-29 110 views
0

我想將一些屬性傳遞給actionListener方法。Primefaces p:menuitem將屬性傳遞給actionListener

我的實現是像...

<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> 

而且在Java中的動作監聽

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 
     } 
} 

我嘗試了用<f:attribute><f:param>但無法在Java中獲得的價值。

在java它顯示爲每個值爲空。

回答

3

如果#{data}引用迭代JSF組件的迭代變量(如<h:dataTable var>),則這將不起作用。 <f:attribute>在JSF視圖構建時設置,而不是在JSF視圖渲染時期間設置。但是,<h:dataTable var>在視圖構建期間不可用,它僅在視圖渲染時間期間可用。

如果環境支持EL 2.2,做的卻

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

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

或者,如果你的環境不對,做的卻

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

部屋BalusC ...謝謝回覆....問題解決了。實際上#{data}超出了範圍。 – 2012-04-05 11:20:36