如何按整数范围过滤数据表?

时间:2019-10-15 17:14:55

标签: jsf primefaces

我在JSF页面中有一个dataTable,其中列出了所有对象。通常,我使用filterBy和filterMatchMode来执行这种类型的操作,但是在这种情况下,我必须过滤给定列的列表,以获得值的范围。我该如何实现?

<p:dataTable id="dtOrders" var="productionOrder"
                        value="#{productionOrdersView.orders}" selectionMode="single"
                        reflow="true" selection="#{productionOrdersView.selected}"
                        filteredValue="#{productionOrdersView.filtered}"
                        widgetVar="ordersTable" rowKey="#{productionOrder.pk}"
                        paginator="true" rows="20">
                        <f:facet name="header">
                           Bolle di lavorazione
                        </f:facet>
                        <p:column headerText="Numero bolla"
                            sortBy="#{productionOrder.orderNumber}"
                            filterFunction="#{productionOrdersView.filter()}"
                            filterOptions="contains">
                            <f:facet name="filter">
                                <h:inputHidden id="filter" />
                            </f:facet>
                            <f:facet name="header">
                                <h:outputText value="Numero bolla" />
                                <h:outputText value="Dalla" />
                                <p:inputText id="from"
                                    value="#{productionOrdersView.orderNumberStartFilter}">
                                    <p:ajax event="keyup" />
                                </p:inputText>
                                <h:outputText value="alla" />
                                <p:inputText id="to"
                                    value="#{productionOrdersView.orderNumberEndFilter}">
                                    <p:ajax event="change"
                                        listener="#{productionOrdersView.filter()}" update="dtOrders"
                                        oncomplete="PF('dtOrders').filter()" />
                                </p:inputText>
                            </f:facet>
                            <h:outputText value="#{productionOrder.orderNumber}" />
                        </p:column>

还有bean方法:

public void filter() {
    System.out.println("Filtering...");
    System.out.println(orderNumberStartFilter+" "+orderNumberEndFilter);
    if(orderNumberStartFilter!=null && orderNumberEndFilter!=null) {
        this.filtered = productionOrderController.findFromToOrderNumber(Integer.valueOf(orderNumberStartFilter), Integer.valueOf(orderNumberEndFilter));
    }else {
        if(orderNumberStartFilter!=null) {
            this.filtered = productionOrderController.findFromToOrderNumber(Integer.valueOf(orderNumberStartFilter), Integer.valueOf(orderNumberStartFilter));
            return;
        }
        if(orderNumberEndFilter!=null) {
            this.filtered = productionOrderController.findFromToOrderNumber(Integer.valueOf(orderNumberEndFilter), Integer.valueOf(orderNumberEndFilter));
            return;
        }
        this.filtered = orders;
    }
    System.out.println(filtered.size());
}

如何过滤列表?这是执行此操作的好方法吗?我也希望,如果仅插入一个值,则过滤器操作将等于(如此精确地排序)。我已经在网上搜索了很多关于日期的示例,但是没有看到整数值。

更新

    list.xhtml:72 Uncaught TypeError: Cannot read property 'filter' of undefined
    at Object.onco (list.xhtml:72)
    at Object.<anonymous> (core.js.xhtml?ln=primefaces&v=7.0:3)
    at u (jquery.js.xhtml?ln=primefaces&v=7.0:2)
    at Object.fireWith [as resolveWith] (jquery.js.xhtml?ln=primefaces&v=7.0:2)
    at k (jquery.js.xhtml?ln=primefaces&v=7.0:2)
    at XMLHttpRequest.<anonymous> (jquery.js.xhtml?ln=primefaces&v=7.0:2)
onco @ list.xhtml:72
(anonymous) @ core.js.xhtml?ln=primefaces&v=7.0:3
u @ jquery.js.xhtml?ln=primefaces&v=7.0:2
fireWith @ jquery.js.xhtml?ln=primefaces&v=7.0:2
k @ jquery.js.xhtml?ln=primefaces&v=7.0:2
(anonymous) @ jquery.js.xhtml?ln=primefaces&v=7.0:2

1 个答案:

答案 0 :(得分:0)

像这样编写代码

xhtml

 <p:column headerText="Order number" sortBy="#{productionOrder.orderNumber}"
      filterFunction="#{productionOrdersView.filter()}"
      filterMatchMode="contains">
          <f:facet name="filter">
               <h:inputHidden id="filter"/>
          </f:facet>
          <f:facet name="header">
      <p:inputText id="from" value="#{productionOrdersView.from}">
          <p:ajax event="keyup" />
      </p:inputText>
      <h:outputText class="fa fa-arrows-h fa-2x" style="vertical-align: middle;"/>
     <p:inputText id="to" value="#{productionOrdersView.to}">
          <p:ajax event="change"  
               listener="#{productionOrdersView.filter()}" update="your_dataTable_Id" 
               oncomplete="PF('your_dataTable_widgetVar').filter()"/>
      </p:inputText>
           </f:facet>
      <h:outputText value="#{productionOrdersView.orderNumber}" />
  </p:column>

在bean中,使用getter和setter以及make o方法过滤2个整数变量from to

 private Integer from;
 private Integer to;
 ..............

 //Method that filter the data
 public void filter(){
   //Filter your data between from - to 
 .......................
    }
}

您可以改进此代码,但我认为这是一个很好的基础。


更新答案

代码的问题在于,您没有将过滤后的列表作为数据表中的值。 要处理此代码,您可以做两件事。 (其中之一
1)如下更改过滤功能。

public void filter() {
System.out.println("Filtering...");
System.out.println(orderNumberStartFilter+" "+orderNumberEndFilter);
if(orderNumberStartFilter!=null && orderNumberEndFilter!=null) {
    this.filtered = productionOrderController.findFromToOrderNumber(Integer.valueOf(orderNumberStartFilter), Integer.valueOf(orderNumberEndFilter));
}else {
    if(orderNumberStartFilter!=null) {
        orders = productionOrderController.findFromToOrderNumber(Integer.valueOf(orderNumberStartFilter), Integer.valueOf(orderNumberStartFilter));
        return;
    }
    if(orderNumberEndFilter!=null) {
        orders = productionOrderController.findFromToOrderNumber(Integer.valueOf(orderNumberEndFilter), Integer.valueOf(orderNumberEndFilter));
        return;
    }

}
System.out.println(orders.size());

}

2)更改数据表值代码中的变量。

<p:dataTable id="dtOrders" var="productionOrder"
                    value="#{productionOrdersView.filtered}" selectionMode="single"
                    reflow="true" selection="#{productionOrdersView.selected}"
                    widgetVar="ordersTable" rowKey="#{productionOrder.pk}"
                    paginator="true" rows="20">
  .................
相关问题