数据表过滤器不起作用

时间:2014-02-25 20:11:26

标签: java jsf primefaces

我正在使用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(可能希望得到一些不同的结果?)。我不知道为什么会这样。

我在这做错了什么?

1 个答案:

答案 0 :(得分:3)

我找到了解决方案。 Primefaces的官方文档提供了一个非工作示例。

所以this错了。正确的方法是here

更准确地说,filterBy字段不应仅包含过滤它的对象的字段,而应包含整个字段,如#{myVar.field}。所以,就我而言,这意味着:

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

我希望其他人会觉得这很有用。