2014-02-28 129 views
3

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

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

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

+0

不,我想在视图中这样,所以我不必重新加载数据。奇怪的是,您无法为数据表中的定义自定义filterMatchMode,但对于(根据说明文件)定义了自定义filterMatchMode。 – fsch

回答

7

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

然而,滤波器的输入仍是一个字符串输入文本。

如果您需要自定义组件来输入过滤器值,或者您坚持使用Primefaces 4(正如我在最近的项目中),我将描述对我有用的东西。

我使用这些关键步骤

  • 把一个正常JSF输入组件成一列,而不是使用filterBy属性
  • 附上一个JavaScript回调触发用户输入该组件的头小面延长过滤行为,这就要求PF('dataTableWidgetVar').filter()
  • filteredValue属性添加到DataTable,它在Java中二传手应用自定义过滤器对现有过滤器顶部

关键是要利用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> 

的Java鉴于filteredResults命名视图的setter和getter:

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

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

其余的是Javascript代码在过滤器组件中的值发生变化时对dataTable应用过滤器。

4

当然可以,

我下面给你一个例子:

<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

希望这将有助于...

+0

这是正确的代码。 –

+0

谢谢,但这不是我真正需要的。我需要一个选项在[可用,启用,禁用]和[可用,启用]之间切换 – fsch

+0

此解决方案适用于我,非常感谢 –

0

让我修改上述大卫

<p:column filterBy="status"  
      filterOptions="#{yourBean.statusOptions}" 
      filterMatchMode="contains"> 
... 
</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"));  
    options.add(new SelectItem("available enable", "Without Disabled"));  

    return options; 
} 

查看上面的代码,它改变了一点点来解决你的问题。

希望这将有助于...

+0

您不能认真对待这一点。这对我来说是不可接受的答案。您应该已经知道,您可以自由编辑其他答案并发表评论。 – alexander