【问题标题】:Dynamic Calculation Using Filter in Datatable在数据表中使用过滤器进行动态计算
【发布时间】:2014-01-23 00:13:18
【问题描述】:

我想在过滤和/或分页 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>

【问题讨论】:

    标签: java jsf primefaces datatable


    【解决方案1】:

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

    您可以找到 Eclipse 示例项目 here,它在 JBoss 7.1.1 上运行,带有 JSF Mojarra 2.2.0m12 和 JDK 1.7

    【讨论】:

    • Sébastien Vanmechelen,我已经使用 Netbeans 7.4 导入了该项目,并使用 Glassfish 4 执行得很好!天啊!大约 4 个月前我一直在寻找这个解决方案,而你解决了这个问题!我真的,真的很感激,很高兴!非常感谢你,上帝保佑你!
    • 很遗憾,示例项目的链接已损坏。
    【解决方案2】:

    我认为您可以在 PF 数据表过滤和/或分页上定义 AJAX 调用。

    <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" 的内容并在更新中使用 来解决update="@(.footerToUpdate)"

    【讨论】:

    • 这听起来不错,但我如何获得“filteredValues 集合”?关于其他事件,排序和分页?谢谢。
    • filteredValues 集合会自动填充。您只需在支持 bean 中使用 get/set 添加此集合,并在 facelet 中的数据表代码中定义属性,就像我之前的 sn-p 中一样。对于'sort'事件,它与'filter'事件相同,只需将'event'属性从'filter'更改为'sort'。
    • 对于分页,有一个 'page' 事件,您可以使用监听器存储当前页面信息,例如: public void onPage(PageEvent e) { DataTable table = (DataTable) e.getComponent( ); logger.info("当前页面:" + e.getPage() +" / 页面大小:" + table.getRows());您只需要使用所有这些事件来更新您的支持 bean 中的总和并渲染它。另一种解决方案是使用一个惰性数据表,它只检索一个页面并计算检索到的元素的总和(cfr primefaces.org/showcase/ui/datatableLazy.jsf)。
    • Sébastien Vanmechelen,当 'jsf' 第一次显示 dataTable 时,它​​会从 db 表中加载所有数据。我推断对象(dataTable)留在内存中(客户端JVM),对吗?当我使用一个小数据集时,我可以使用我们正在讨论的这种方式;否则,我应该使用 LazyLoad 方式,对吗?我按照你说的做了(请参阅上面我更新的代码),但是“过滤列表”没有被自动填充。我错过了什么吗?谢谢。
    • 由于您的网页中没有Applet,因此浏览器页面和客户端JVM之间没有交互。 dataTable 组件保留在内存中,但在服务器端。使用这种方式可能没问题。乍一看,您的代码似乎没问题。今天下午我会尝试给你一个完整的工作示例。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-03-16
    • 2018-11-21
    • 2018-12-23
    • 1970-01-01
    • 2022-11-29
    • 1970-01-01
    相关资源
    最近更新 更多