【问题标题】:Primefaces custom filter in datatable数据表中的 Primefaces 自定义过滤器
【发布时间】:2014-02-28 13:35:47
【问题描述】:

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

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

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

【问题讨论】:

  • 不,我想在视图中这样做,这样我就不必重新加载数据。有点奇怪,您不能为数据表中的 定义自定义 filterMatchMode 而是为 (根据文档)。

标签: jsf jsf-2 primefaces


【解决方案1】:

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

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

如果您需要自定义组件来输入过滤器值,或者您被 Primefaces 4 卡住(因为我在最近的一个项目中),我将描述什么对我有用。

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

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

关键是利用filteredValue 属性——当Primefaces filter() 函数被调用或primefaces 过滤器改变时,filteredValue 被设置为列出过滤后的值(如果没有应用过滤器,则为null)。然后 Primefaces 从 getter 中读回 filtersValues 以更新 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>

视图命名视图中过滤结果的Java Setter和Getter:

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

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

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

【讨论】:

    【解决方案2】:

    当然可以,

    下面我举个例子:

    <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

    希望对您有所帮助...

    【讨论】:

    • 谢谢,但这并不是我真正需要的。我需要一个选项在 [Available,Enabled,Disabled] 和 [Available,Enabled] 之间切换
    猜你喜欢
    • 1970-01-01
    • 2013-08-01
    • 2014-01-04
    • 1970-01-01
    • 2013-07-25
    • 1970-01-01
    • 2018-07-01
    • 1970-01-01
    • 2013-12-13
    相关资源
    最近更新 更多