2014-01-05 2 views
1

Primefaces dataTable을 필터링하거나 페이지 매김 할 때 dataSet 값의 합계를 동적으로 업데이트하려고합니다.Datatable에서 필터를 사용하는 동적 계산

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

방법 소마 :

http://datatables.net/examples/advanced_init/footer_callback.html이 문제에 대한 내 주요 코드 아래 참조 :

다음의 jQuery 예 정확히 행동이 내가 원하는 보여줍니다

private float soma; 

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

누군가 나를 도울 수 있습니까?

미리 감사드립니다.

업데이트 코드

빈 (bean) :

@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 (ommited 일부 열) :

<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 /> 해결 방법으로 작업하고 있습니다.

당신은 JSF 인 Mojarra 2.2.0m12 및 JDK 1.7

+0

Sébastien Vanmechelen, I 've Netbeans 7.4와 함께 프로젝트를 가져 와서 Glassfish 4로 실행했습니다. 오 이런! 약 4 개월 전에이 솔루션을 찾고 있었고 해결했습니다! 나는 정말로, 정말로 감사하고 그것에 만족한다! 고마워요. 신의 축복이 있습니다! – jMarcel

1

난 당신이 AJAX는 PF 데이터 테이블 필터링을 부르는 정의 할 수 있다고 생각하고/또는 페이징. 당신의 updateSum() 방법에서

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

, 당신은 filteredValues를 통해 사업을 할 수 수집을 걸어 갈 수 있습니다.

당신은 데이터 테이블 안에 업데이트 구성 요소를 대상으로 몇 가지 어려움이있을 수 있지만, 이것은 당신을styleClass = "footerToUpdate"같은 것을 추가하고 = "@업데이트 (과 업데이트에를 사용하여 해결할 수 있습니다. footerToUpdate) "

+0

이것은 좋은 소리와 제이 보스 7.1.1에서 실행 이클립스 샘플 프로젝트 here을 찾을 수 있지만, 내가 어떻게 "filteredValues ​​수집은"어떻게해야합니까? 그리고 다른 사건들에 관해서는, 정렬과 페이지 매김? 감사. – jMarcel

+0

filteredValues ​​컬렉션이 자동으로 채워집니다. 이 콜렉션을 backing 빈의 get/set과 함께 추가하기 만하면되고, 이전 스 니펫에서와 같이 facelet의 데이터 테이블 코드에있는 프로퍼티를 정의해야한다. 'sort'이벤트의 경우 'filter'이벤트와 동일하므로 'event'속성을 'filter'에서 'sort'로 변경하면됩니다. –

+0

페이지 매김의 경우 '페이지'이벤트가 있고 다음과 같은 청취자와 함께 현재 페이지 정보를 저장할 수 있습니다. public void onPage (PageEvent e) { DataTable table = (DataTable) e.getComponent(); logger.info ("현재 페이지 :"+ e.getPage() + "/ 페이지 크기 :"+ 표.getRows()); } 백업 빈에서 합계를 업데이트하고 렌더링하려면 이러한 모든 이벤트를 수행하기 만하면됩니다. 또 다른 해결책은 한 페이지 만 검색하고 검색된 요소에 대한 합계를 계산하는 lazy dataTable을 사용하는 것입니다 (cfr http://www.primefaces.org/showcase/ui/datatableLazy.jsf). –

관련 문제