2014-02-28 130 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