2014-01-05 117 views
1

我想在过滤和/或分页Primefaces数据表时动态更新dataSet值的总和。使用数据表中的过滤器进行动态计算

下面的jQuery的例子显示正是的行为我想:http://datatables.net/examples/advanced_init/footer_callback.html

见下面我主要的代码针对此问题:

JSF的

<p:columnGroup type="footer"> 
    <p:row> 
    <p:column colspan="6" footerText="Grand Total:" style="text-align:right"/> 
     <p:column colspan="7"> 
     <f:facet name="footer"> 
      <h:outputText value="#{purchaseOrderController.soma}"> 
      <f:convertNumber pattern="###,###" locale="pl_PL"/> 
      </h:outputText> 
     </f:facet> 
    </p:column> 
    </p:row> 
</p:columnGroup> 

的方法SOMA:

private float soma; 

public float getSoma() { 
    for (PurchaseOrder p : getItems()) { 
     soma += p.getShippingCost().floatValue(); 
    } 
    return soma; 
} 

有人可以帮我吗?

在此先感谢。

更新代码

豆子:

@Named(value = "purchaseOrderController") 
@ViewScoped 
public class PurchaseOrderController extends AbstractController<PurchaseOrder> implements Serializable { 

private float soma = 0; 
private float somaFiltered = 0; 
private List<PurchaseOrder> filteredPurchaseOrder; 

public List<PurchaseOrder> getFilteredPurchaseOrder() { 
    return filteredPurchaseOrder; 
} 

public void setFilteredPurchaseOrder(List<PurchaseOrder> filteredPurchaseOrder) { 
    this.filteredPurchaseOrder = filteredPurchaseOrder; 
} 

//return the sum for the FILTERED list - using this method, get a NullPointerException (the filtered list is null) 
public float getSomaFiltered() { 
    for (PurchaseOrder p : filteredPurchaseOrder) { 
      somaFiltered += p.getQuantity() * p.getShippingCost().floatValue(); 
    } 
    return somaFiltered; 
} 

//return the sum for the ENTIRE list - using this method it's ok 
public float getSoma() { 
    for (PurchaseOrder p : getItems()) { 
     soma += p.getQuantity() * p.getShippingCost().floatValue(); 
    } 
    return soma; 
    } 

@Inject 
private PurchaseOrderFacade ejbFacade; 

public PurchaseOrderController() { 
    super(PurchaseOrder.class); 
} 

} 

了JSF(某些列中省略):

<h:form id="PurchaseOrderListForm"> 
    <p:panel header="#{appBundle.ListPurchaseOrderTitle}"> 
    <p:dataTable id="datalist" var="item" value="#{purchaseOrderController.items}" 
        filteredValue="#{purchaseOrderController.filteredPurchaseOrder}" 
        selectionMode="single" selection="#{purchaseOrderController.selected}" 
        rowKey="#{item.orderNum}" 
        paginator="true" 
        rows="10" 
        rowsPerPageTemplate="10,20,30" 
        > 

     <p:ajax event="rowSelect" update="createButton viewButton editButton deleteButton"/> 
     <p:ajax event="rowUnselect" update="createButton viewButton editButton deleteButton"/> 
     <p:ajax event="filter" listener="#{purchaseOrderController.filteredPurchaseOrder}" update="partialSoma" /> 

     <p:column sortBy="#{item.quantity}" filterBy="#{item.quantity}"> 
      <f:facet name="header"> 
       <h:outputText value="#{appBundle.ListPurchaseOrderTitle_quantity}"/> 
      </f:facet> 
      <h:outputText value="#{item.quantity}"/> 
     </p:column> 
     <p:column sortBy="#{item.shippingCost}" filterBy="#{item.shippingCost}"> 
      <f:facet name="header"> 
       <h:outputText value="#{appBundle.ListPurchaseOrderTitle_shippingCost}"/> 
      </f:facet> 
      <h:outputText value="#{item.shippingCost}"/> 
     </p:column> 
     <p:columnGroup type="footer"> 
      <p:row> 
       <p:column colspan="6" footerText="Grand Total:" style="text-align:right"/> 
        <p:column colspan="7"> 
         <f:facet name="footer"> 
          <h:outputText id="partialSoma" value="#{purchaseOrderController.somaFiltered}"> 
          </h:outputText> 
         </f:facet> 
        </p:column> 
       </p:row> 
      </p:columnGroup> 
     </p:dataTable> 
    </p:panel> 
</h:form> 

回答

2

对不起,我迟到了,但我实际上没有很多时间与我的工作。 昨天下午我花了一点时间来建立一个小工作的例子。事实上,我在使用AJAX更新页脚时遇到了一些问题(cfr:http://forum.primefaces.org/viewtopic.php?f=3&t=15658),但它正在使用<p:remoteCommand />解决方法。

您可以找到Eclipse的示例项目here,与JSF钻嘴鱼科2.2.0m12和JDK 1.7

+0

SébastienVanmechelen,我已经使用Netbeans 7.4导入项目并使用Glassfish 4执行就好!天啊!大约4个月前我正在寻找这个解决方案,你解决了这个问题!我真的非常感激并且很高兴!非常感谢你,上帝保佑你! – jMarcel

1

我认为,你可以定义AJAX在PF数据表中过滤来电和/或分页。

<p:dataTable value="#{myBackingBean.values}" var="row" filteredValue="#{myBackingBean.filteredValues}" > 
    <p:ajax event="filter" listener="#{myBackingBean.updateSum}" update="componentToUpdate" /> 
    ... 
</p:dataTable> 

在你updateSum()方法,您可以通过filteredValues走集合做你的生意。

你可能有一些困难的目标封装在数据表更新组件,但是这可以通过添加类似的styleClass =“footerToUpdate”你,并与更新=“@(更新用它来解决。 footerToUpdate)“

+0

这听起来不错在JBoss 7.1.1运行,但我如何获得“filteredValues集”?而关于其他事件,排序和分页?谢谢。 – jMarcel

+0

filteredValues集合被自动填充。你只需要在你的支持bean中添加一个get/set来添加这个集合,并像在我之前的代码片段中那样在facelet中定义数据表的代码中的属性。 对于'sort'事件,它与'filter'事件相同,只需将'event'属性从'filter'更改为'sort'即可。 –

+0

对于分页,有一个'页面'事件,您可以将当前页面信息与听众一起存储,如: public void onPage(PageEvent e){ DataTable table =(DataTable)e.getComponent(); logger.info(“当前页面:”+ e.getPage()+“/页面大小:”+表格。GetRows的()); } 你只需要玩所有这些事件来更新你的支持bean中的总和并进行渲染。 另一个解决方案是使用懒惰的dataTable,它只检索一个页面并计算你检索到的元素的总和(cfr http://www.primefaces.org/showcase/ui/datatableLazy.jsf)。 –

相关问题