PrimeFaces dataTable排序不起作用

时间:2013-11-18 15:43:41

标签: jsf sorting primefaces datatable

我无法使PrimeFaces dataTable组件的排序行为按照记录的方式工作。 (我使用的是PrimFaces 4.0,JSF 2.1.12和Tomcat 7.0。)据我所知,我看到的问题与PF dataTable相关的任何其他问题报告/讨论都不对应。为了探索这个问题,我基于使用已排序的dataTable的ShowCase示例创建了一个示例,复制了tableBean支持bean的ShowCase源代码(包括为示例生成本地汽车数据;不涉及外部数据库访问)和支持汽车类。 xhtml也是ShowCase示例的非常接近的副本:

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" 
"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">

<html xmlns="http://www.w3.org/1999/xhtml"
    xmlns:ui="http://java.sun.com/jsf/facelets"
    xmlns:h="http://java.sun.com/jsf/html"
    xmlns:f="http://java.sun.com/jsf/core"
    xmlns:p="http://primefaces.org/ui">
    <h:head>
    </h:head>
    <h:body>
           <h:form>

               <p:dataTable id="dataTable" var="car" value="#{tableBean.carsSmall}">
                   <f:facet name="header">
                       Ajax Sorting
                   </f:facet>

                   <p:column id="modelHeader" sortBy="#{car.model}">
                       <f:facet name="header">
                           <h:outputText value="Model" />
                       </f:facet>
                       <h:outputText value="#{car.model}" />
                   </p:column>

                   <p:column sortBy="#{car.year}">
                       <f:facet name="header">
                           <h:outputText value="Year" />
                       </f:facet>
                       <h:outputText value="#{car.year}" />
                   </p:column>

                   <p:column sortBy="#{car.manufacturer}">
                       <f:facet name="header">
                           <h:outputText value="Manufacturer" />
                       </f:facet>
                       <h:outputText value="#{car.manufacturer}" />
                   </p:column>

                   <p:column sortBy="#{car.color}">
                       <f:facet name="header">
                           <h:outputText value="Color" />
                       </f:facet>
                       <h:outputText value="#{car.color}" />
                   </p:column>
               </p:dataTable>

           </h:form>
    </h:body>
</html>

运行xhtml时,数据表会显示,但只显示一列可供排序(即标题中有向上/向下箭头图标)。

dataTable有两个问题:

  1. 只有一列(Year)显示为可用于排序。 (Year是Car类中“int”类型的属性,而其他三列是String类型,因此问题的一个方面是String字段忽略sortBy =“#{car.xxx}”标记。)
  2. 事实上,Year列不可排序。单击Year标题的向上/向下箭头无效。单击Year标头时会发生服务器回调,但表未进行排序。我已经跟踪了在服务器回调期间发生的ELException,其中代码无法处理表达式“#{car.0}”。毫无疑问,“0”应该是“年”,失败的表达无疑是为什么没有进行排序。
  3. 在弄清楚为什么这个非常简单的例子(几乎从ShowCase源中逐字复制)尝试使用PrimeFaces可排序的dataTable时,任何帮助都会受到赞赏。

3 个答案:

答案 0 :(得分:4)

像这样删除磅和花括号:

由此:

<p:column sortBy="#{car.manufacturer}">

到此

<p:column sortBy="manufacturer">

我遇到了同样的问题而且仅仅是因为这个问题。

答案 1 :(得分:2)

你的第一个字符串是

<p:dataTable id="dataTable" var="car" value="#{tableBean.cars}">

所以tableBean有一个方法

public List<Car> getCars()
{
    return carEJB.findAll();
}

但是你的bean在排序后没有保存方法结果的变量。

解决方案:

public class CarController
{
...
    private List<Car> cars;
...
    privare void reset()
    {
        cars = carEJB.findAll();
    }
...
    public List<Car> getCars()
    {
        return cars;
    }
}

答案 2 :(得分:0)

由于lazy =“ true”的存在,我的数据表未排序。当我删除它时,它起作用了。我知道您没有使用该属性。