2014-02-25 92 views
1

我正在使用Primefaces創建可篩選表。數據表篩選器不工作

<p:dataTable id="tasksTable" value="#{taskView.currentTasks}" var="task" rowIndexVar="index" filteredValue="#{taskView.filteredTasks}"> 
       <p:column headerText="Name"> 
        <h:outputText value="#{task.name}"></h:outputText> 
       </p:column> 
       <p:column headerText="Type" filterBy="type" 
          filterMatchMode="containing"> 
        <h:outputText value="#{task.type}"></h:outputText> 
       </p:column> 
       <p:column headerText="Date Started"> 
        <h:outputText value="#{task.startTime}"></h:outputText> 
       </p:column> 
       <p:column headerText="Details"> 
        <h:outputText value="#{task.details}"></h:outputText> 
       </p:column> 
</p:dataTable> 

這是我的看法:

@Component("taskView") 
@Scope("session") 
public class TaskView{ 
private List<TaskDTO> currentTasks; 

private List<TaskDTO> filteredTasks; 
//getters and setters 

} 

的問題是,過濾不工作。顯然,它使一個沒有收到答案的ajax調用只是一直在等待。在後端,currentTasks列表的getter被多次調用。

在我看來,Primefaces進行ajax調用,出於某種原因在服務器端它調用表結果的getter很多次(也許希望得到一些不同的結果?)。我不知道爲什麼會發生。

我在這裏做什麼錯了?

+0

除非它是一個錯字,我不認爲'contains'是一個有效的'filterMatchMode'。你應該有'包含' – kolossus

+0

@kolossus雖然你是對的,但是謝謝你,我也嘗試過'exact'或者將它作爲默認值,並且我得到了同樣的結果。還有其他問題嗎? – Dragos

回答

2

我找到了解決方案。 Primefaces的官方文檔提供了一個非工作示例。因此this是錯誤的。正確的做法是here

更準確地說,filterBy字段不應只包含對其進行過濾的對象的字段,而應包含整個字段,如#{myVar.field}。所以,在我而言,這將意味着:

<p:column headerText="Type" filterBy="#{task.type}" 
         filterMatchMode="contains"> 
       <h:outputText value="#{task.type}"></h:outputText> 
      </p:column> 

我希望其他人會發現這很有用。