Jsf 如何按整数范围筛选数据表?

Jsf 如何按整数范围筛选数据表?,jsf,primefaces,Jsf,Primefaces,我在JSF页面中有一个dataTable,其中列出了我的所有对象。通常我使用filterBy和filterMatchMode来执行这种类型的操作,但在这种情况下,我必须为给定的列筛选列表,以获得一个值范围。我怎样才能做到这一点 <p:dataTable id="dtOrders" var="productionOrder" value="#{productionOrdersView.orders}" selectionMode="single

我在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>
如何筛选列表?这是执行此操作的好方法吗?我还希望,如果只插入一个值,则过滤器操作将被设置为相等(顺序精确)。我在网上搜索过很多关于日期的例子,但是没有看到整数值的例子

更新

    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
list.xhtml:72未捕获类型错误:无法读取未定义的属性“filter”
在Object.onco(list.xhtml:72)
反对。(core.js.xhtml?ln=primefaces&v=7.0:3)
在u处(jquery.js.xhtml?ln=primefaces&v=7.0:2)
在Object.fireWith[as resolveWith](jquery.js.xhtml?ln=primefaces&v=7.0:2)
在k处(jquery.js.xhtml?ln=primefaces&v=7.0:2)
在XMLHttpRequest。(jquery.js.xhtml?ln=primefaces&v=7.0:2)
onco@list.xhtml:72
(匿名)@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
(匿名)@jquery.js.xhtml?ln=primefaces&v=7.0:2

让你的代码像这样

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>
您可以改进此代码,但我认为这是一个很好的基础


更新答案 代码的问题在于没有将筛选列表作为值放入数据表中。 要使用此代码,您可以做两件事。(做其中一个
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) 更改datatable值代码中的变量

<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">
  .................

.................

您可以这样做,并制作自己的过滤器。查看价格中的过滤器谢谢,但只有一个值!在我的例子中,我需要一个范围,因此在@tsotzolasOk中有两个值(max和min)我发现了javascript错误。将
PF('dtOrders').filter()更改为
PF('ordersTable').filter()
。我也会改变我的答案。您必须将widgetVar值放在那里,因为widgetVar值也会进行此更改,但值不会更新,而系统输出仅为2个值。这些值不会更新,因为您将datable值放在了列表中,而不是过滤后的值。在
p:datatable
中,字段
filteredValue
是从表中获取过滤后的值,而不是将过滤后的值放入方法中。谢谢,但是我发现更新方法有一些问题;我错在哪里?我已经更新了我的问题。filter方法运行良好?是否使用输入数字过滤日期?如果您更新整个表单,并且不仅
dtOrders
工作正常?filter()方法工作正常,因为控制台输出为2(这是正确的,因为我输入了两个连续的数字,但表中显示的是整个项目,而不仅仅是2个项目。datatable的值必须是
过滤的
值。因此,最好在过滤器中放置
顺序
,而不是
过滤的
过滤的
值是一个可以使用va的列表正如您在filter()方法中看到的那样,filterYes后面的lues是筛选列表
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());
<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">
  .................