Primefaces数据表中的自定义过滤器

时间:2014-02-28 13:35:48

标签: jsf jsf-2 primefaces

是否可以为数据表编写自定义过滤器?

我想过滤有关属性status_flag的数据。此status_flag可以具有以下值:available,enable,disabled。

我需要一个过滤方法,向我显示总列表或没有禁用的总列表。

2 个答案:

答案 0 :(得分:9)

对于Primefaces 5,有一个新的属性filterFunction可以在Java代码中定义自定义过滤器:http://blog.primefaces.org/?p=3084

但是,过滤器输入仍然是输入文本中的字符串。

如果您需要一个自定义组件来输入过滤器值,或者您仍然坚持使用Primefaces 4(就像我最近的项目一样),我将描述对我有用的内容。

我使用这些关键步骤扩展了过滤行为

  • 将一个普通的JSF输入组件放入列的标题面,而不是使用filterBy属性
  • 将javascript回调附加到在用户输入上触发的此组件,该组件调用PF('dataTableWidgetVar').filter()
  • 将filteredValue属性添加到dataTable,它在现有过滤器之上的Java setter中应用自定义过滤器

关键是要利用filteredValue属性 - 当调用Primefaces filter()函数或者当primefaces过滤器更改时,filteredValue被设置为列出过滤值(如果没有应用过滤器,则为null)。然后Primefaces从getter读取filteredValues以更新dataTable中的项目列表。如果我们将过滤器置于这些调用之间(在getter或setter中,setter效率更高,因为只有在过滤器更改时才调用),我们使用过滤器修改原始过滤列表并通过getter返回。

一些代码:

使用inputText作为过滤器组件定义数据表:

<p:dataTable filteredValue="#{view.filteredResults} >
    ...
    <p:columnGroup type="header">
    ...
        <p:row>
    ...
           <p:column>
               <f:facet name="header">
                    <p:inputText value="#{view.filterValue}" />
                </f:facet>
           </p:column>

    ...
</p:dataTable>

在视图命名视图中的filteredRerults的Java Setter和Getter:

public void setFilteredResults(List<?> filteredResults) {
    this.filteredResults = applyPremiumFilters(filteredResults, filterValue);
}

public List<?> getFilteredResults() {
    return this.filteredResults;
}

其余是Javascript代码,用于在过滤器组件中的值更改时对dataTable应用过滤器。

答案 1 :(得分:7)

当然可以,

我将在下面举例说明:

<p:column filterBy="status"    
          filterOptions="#{yourBean.statusOptions}"  
          filterMatchMode="exact">  
...
</p:column>

Java代码:

public List<SelectItem> getStatusOptions()
{  
    List<SelectItem> options = new ArrayList<SelectItem>();  

    options.add(new SelectItem("avalaible", "Avalaible"));
    options.add(new SelectItem("enable",    "Enable")); 
    options.add(new SelectItem("disabled",  "Disabled"));     

    return options;  
}  

使用SelectItem

您可以在http://www.primefaces.org/showcase/ui/datatableFiltering.jsf

找到示例

希望它会有所帮助...