Jsf 在p:dataTable上使用自定义全局筛选器
我试图在PrimeFaces中使用全局过滤器实现逗号分隔的关键字搜索 如果用户在全局搜索中键入Jsf 在p:dataTable上使用自定义全局筛选器,jsf,primefaces,jsf-2,primefaces-datatable,Jsf,Primefaces,Jsf 2,Primefaces Datatable,我试图在PrimeFaces中使用全局过滤器实现逗号分隔的关键字搜索 如果用户在全局搜索中键入word1、word2,则应返回包含word1和word2的所有行。到目前为止,我无法在PrimeFaces中找到用于全局搜索的预定义多词搜索功能。全局搜索仅适用于单个关键字。例如:仅当用户键入word1或word2时,搜索才会返回结果 PrimeFaces似乎使用客户端API filter()进行全局搜索。有没有一种方法可以实现使用多个关键字的搜索 <p:dataTable id="dwg" w
word1、word2
,则应返回包含word1
和word2
的所有行。到目前为止,我无法在PrimeFaces中找到用于全局搜索的预定义多词搜索功能。全局搜索仅适用于单个关键字。例如:仅当用户键入word1
或word2
时,搜索才会返回结果
PrimeFaces似乎使用客户端API filter()进行全局搜索。有没有一种方法可以实现使用多个关键字的搜索
<p:dataTable id="dwg" widgetVar="tblDwgDtl" var="dwgDtl"
value="#{dwgCtrlr.dwgs} sortMode="multiple" scrollable="true"
styleClass="bsa-drawing" rows="25" resizableColumns="true">
<f:facet name="header">
<p:panelGrid styleClass="ui-panelgrid-blank">
<p:row>
<p:column colspan="6">
<p:inputText id="globalFilter"
onkeyup="PF('tblDwgDtl').filter()"
placeholder="#{msg['searchAllFields.text']}" />
</p:column>
</p:row>
</p:panelGrid>
</f:facet>
PrimeFaces 8.0及以上版本
在PrimeFaces 8.0中,您可以使用p:dataTable
的globalFilterFunction
属性来实现自定义全局过滤器。看见
示例用法:
<p:dataTable ... globalFilterFunction="#{dtFilterView.globalFilterFunction}">
...
</p:dataTable>
在PrimeFaces 8.0之前
你能做的就是。然后,将过滤器功能
替换为自定义版本。因此,您需要扩展过滤器功能
和
public boolean globalFilterFunction(Object value, Object filter, Locale locale) {
String filterText = (filter == null) ? null : filter.toString().trim().toLowerCase();
if (filterText == null || filterText.equals("")) {
return true;
}
int filterInt = getInteger(filterText);
Car car = (Car) value;
return car.getId().toLowerCase().contains(filterText)
|| car.getBrand().toLowerCase().contains(filterText)
|| car.getColor().toLowerCase().contains(filterText)
|| (car.isSold() ? "sold" : "sale").contains(filterText)
|| car.getYear() < filterInt
|| car.getPrice() < filterInt;
}
public boolean globalFilterFunction(Object rowValue, Object filter, Locale locale) {
String filterText = (filter == null) ? null : filter.toString();
if (filterText == null || filterText.isEmpty()) {
return true;
}
return Stream.of(filterText.split(","))
.allMatch(word -> singleWordFilter(value, word));
}
private boolean singleWordFilter(Object rowValue, String word) {
// do your single word filtering logic
}