【问题标题】:Primefaces datatable filter doesn't workPrimefaces 数据表过滤器不起作用
【发布时间】:2014-08-09 04:43:11
【问题描述】:

我必须做一些根本错误的事情,我使用数据表将代码精简到最低限度,并启用了一个列过滤器和一个地球过滤器。

有趣的是,Primefaces 的示例代码有效。我的代码的唯一区别应该是它从数据库收集数据而不是在 bean 中生成数据。

我不知道为什么当我在过滤器中键入内容时我的示例没有执行任何操作,如果有任何想法,我将不胜感激。

我的 xhtml:

    <!DOCTYPE html>
<html xmlns="http://www.w3c.org/1999/xhtml"
    xmlns:h="http://java.sun.com/jsf/html"
    xmlns:ui="http://java.sun.com/jsf/facelets"
    xmlns:f="http://java.sun.com/jsf/core"
    xmlns:p="http://primefaces.org/ui">

<ui:composition template="layout.xhtml">

    <ui:define name="title">All Projects</ui:define>    

    <ui:define name="content">


        <p:dataTable var="project" value="#{projectController.allProjects}" widgetVar="projectTable" filteredValue="#{projectController.filteredProjects}">

            <f:facet name="header">
                <p:outputPanel>  
                    <h:outputText value="Search all fields:" />  
                    <p:inputText id="globalFilter" onkeyup="PF('projectTable').filter()" style="width:150px" />  
                </p:outputPanel>
            </f:facet>

            <p:column headerText="Name" filterBy="#{project.name}">
                <h:outputText value="#{project.name}" />
            </p:column>

            <p:column headerText="Priority">
                <h:outputText value="#{project.priority}" />
            </p:column>

            <p:column headerText="Exit">
                <h:outputText value="#{project.exitCriteria}" />
            </p:column>

        </p:dataTable>      

    </ui:define>
</ui:composition>

我的豆子:

    package com.apa.projectd.common;
    import java.io.Serializable;
    import java.util.List;
    import javax.annotation.PostConstruct;
    import javax.enterprise.context.SessionScoped;
    import javax.faces.bean.ManagedBean;
    import javax.inject.Inject;
    import com.habony.common.Loggable;
    import com.habony.projectd.ejbs.ProjectEJB;
    import com.habony.projectd.enteties.Project;

    @ManagedBean(name="projectController")
    @SessionScoped
    @Loggable
    public class ProjectController implements Serializable{

private static final long serialVersionUID = 8345760187637787728L;

@Inject
private ProjectEJB projectEJB;

private List<Project> filteredProjects;
private List<Project> allProjects;

@PostConstruct
public void loadAllProjects(){
    allProjects =  projectEJB.getAllProjects();
}

//
// Getters and Setters
//
public List<Project> getFilteredProjects() {
    return filteredProjects;
}

public void setFilteredProjects(List<Project> filteredProjects) {
    this.filteredProjects = filteredProjects;
}

public void setAllProjects(List<Project> allProjects) {
    this.allProjects = allProjects;
}

public List<Project> getAllProjects(){
    return allProjects;
}

}

【问题讨论】:

  • 它甚至显示任何数据吗?还是只是过滤器不起作用?
  • 显示数据工作正常。
  • 问题出在列还是全局过滤器?

标签: primefaces filter datatable


【解决方案1】:

过滤和/或排序时不要使用延迟加载

【讨论】:

    【解决方案2】:

    最后我发现,当你使用 Lazy 时,过滤后的数据不会像非惰性实现那样存储在其他变量中,每次调用过滤器时都会执行 load 方法,所以我不得不将过滤器也放在我的 Load 中,这也是使用 Lazy 时的排序方式。

    我的错!

    【讨论】:

    • 上面的代码没有使用lazy,所以这个答案对这个问题无效
    【解决方案3】:

    请查看惰性属性,这可能是您的数据未过滤。

    lazy="true"lazy=false

    【讨论】:

    • 对我来说很好。谢谢。
    • 谢谢!这解决了我的排序和过滤问题。 ?
    【解决方案4】:

    p:dataTable 的过滤器功能需要包裹在&lt;h:form&gt; 标签中才能正常工作。修改的代码 xhtml 将:

    <!DOCTYPE html>
    <html xmlns="http://www.w3c.org/1999/xhtml"
        xmlns:h="http://java.sun.com/jsf/html"
        xmlns:ui="http://java.sun.com/jsf/facelets"
        xmlns:f="http://java.sun.com/jsf/core"
        xmlns:p="http://primefaces.org/ui">
    
    <ui:composition template="layout.xhtml">
    
        <ui:define name="title">All Projects</ui:define>    
    
        <ui:define name="content">
           <h:form>
               <p:dataTable var="project" value="#{projectController.allProjects}" widgetVar="projectTable" filteredValue="#{projectController.filteredProjects}">
    
                  <f:facet name="header">
                    <p:outputPanel>  
                        <h:outputText value="Search all fields:" />  
                        <p:inputText id="globalFilter" onkeyup="PF('projectTable').filter()" style="width:150px" />  
                     </p:outputPanel>
                  </f:facet>
    
                  <p:column headerText="Name" filterBy="#{project.name}">
                     <h:outputText value="#{project.name}" />
                  </p:column>
    
                  <p:column headerText="Priority">
                     <h:outputText value="#{project.priority}" />
                  </p:column>
    
                 <p:column headerText="Exit">
                     <h:outputText value="#{project.exitCriteria}" />
                 </p:column>
    
              </p:dataTable>      
          </h:form>
       </ui:define>
    </ui:composition>
    

    【讨论】:

    • 这在您不使用分页和懒惰时有效。在我开始使用惰性和分页的那一刻,过滤器崩溃了。没有错误,只是它不起作用!
    • @MadMad666,这个问题是关于过滤器不起作用的。不是分页,也不是延迟加载。
    【解决方案5】:

    您应该使用包含 ArrayList allProjects 的相同数据初始化 filtredProjects,如下所示:

    @PostConstruct
    public void loadAllProjects(){
    allProjects =  projectEJB.getAllProjects();
    filtredProjects = projectEJB.getAllProjects();
    }
    

    【讨论】:

    • 最后我发现当你使用 Lazy 时,过滤后的数据不会像非惰性实现那样存储在其他变量中,每次调用过滤器时都会执行加载方法,所以我不得不把过滤器同样在我的加载中,排序也是使用 Lazy 时的方式。我的错!
    猜你喜欢
    • 1970-01-01
    • 2014-07-19
    • 1970-01-01
    • 1970-01-01
    • 2016-06-29
    • 2014-01-04
    • 1970-01-01
    • 2014-07-07
    • 1970-01-01
    相关资源
    最近更新 更多