3

我正在尝试使用 PrimeFaces 中的全局过滤器实现逗号分隔的关键字搜索。

如果用户在word1,word2全局搜索中输入,则所有具有word1word2应该返回的行。截至目前,我无法在 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>
4

1 回答 1

5

PrimeFaces 8.0 及更高版本

从 PrimeFaces 8.0 开始,您可以使用 的globalFilterFunction属性p:dataTable来实现您的自定义全局过滤器。请参阅 https://primefaces.github.io/primefaces/8_0/#/components/datatable?id=filtering

示例使用:

<p:dataTable ... globalFilterFunction="#{dtFilterView.globalFilterFunction}">
  ...
</p:dataTable>
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
}

PrimeFaces 8.0 之前

您可以做的是将数据表渲染器替换为自定义渲染器。然后,在那里,将 替换FilterFeature为自定义版本。因此,您需要扩展FilterFeature处理那里的多个关键字

于 2019-02-06T08:35:22.480 回答