【问题标题】:Datatable filter not working数据表过滤器不起作用
【发布时间】:2014-02-26 21:12:11
【问题描述】:

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

我在这里做错了什么?

【问题讨论】:

  • 除非是拼写错误,否则我不认为containing 是有效的filterMatchMode。你应该有contains
  • @kolossus 虽然你是对的,但谢谢你,我也尝试过exact 或将其保留为默认值,我得到了同样的结果。还有什么问题吗?

标签: java jsf primefaces


【解决方案1】:

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

所以this 是错误的。正确的做法是here

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

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

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

【讨论】:

    猜你喜欢
    • 2014-08-09
    • 1970-01-01
    • 1970-01-01
    • 2022-01-24
    • 1970-01-01
    • 2017-02-24
    • 2020-08-23
    • 2015-11-24
    • 2016-07-26
    相关资源
    最近更新 更多