我在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
答案 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">
.................