2012-03-29 109 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