2014-02-25 64 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> 

我希望其他人会发现这很有用。