Primefaces p: menuitem передает атрибуты в actionListener - PullRequest
0 голосов
/ 29 марта 2012

Я хотел бы передать некоторые атрибуты методу 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 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
      }
}

Я попробовал это, используя <f:attribute> и <f:param>, но не смог получить значение в Java.

В Java Это показывает нуль для каждого значения.

1 Ответ

3 голосов
/ 29 марта 2012

Это не будет работать, если #{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);
    // ...
}
...