2014-01-05 91 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)。 –

相關問題