当前位置: 首页 > 知识库问答 >
问题:

在Primefaces中,Datatable不在列上使用sortBy排序

巢睿
2023-03-14

我决定问这里,这样我就能解决我的问题。在我写信给你之前,我可以向你保证,我在谷歌搜索了很多,但没有找到答案。

在我的PRIMEFACES中,p:DataTable中p:Column中的sortBy和filterBy不起作用。

让我们从SortBy开始。()在我尝试的所有版本中,如您在下面的pom.xml中所看到的:6.2,7.0,7.0.rc3,8.0,8.0.rc3中所示,它都有这样的行为:它显示列headerText,带有两个向上/向下箭头。当我点击箭头时,他们不会改变“向上”,之后是“向下”。而且显然没有进行排序。()只有在下面的pom.xml:6.0、6.1中看到的版本中,它才有这种行为:它显示列headerText,带有两个向上/向下箭头。当我点击箭头时,它们会在“向下”之后改变“向上”。但仍然没有进行排序。

在一些帖子中他们说,我必须先应用过滤,并对过滤后的列表进行排序。我试着用过滤器...没有过滤,也没有排序...神奇的是,滤镜在前面提到的所有版本中都不起作用……

在下面我写我用过的所有文件...我使用Spring MVC 5.2.1(Spring beans)、Hibernate 5.4.3/JPA、JSF 2.2.20、PrimeFaces。我试图重现“PrimeFaces Showcase/DataTable/sorting”的示例。

-----------pom.xml------------

<dependency>
    <groupId>com.sun.faces</groupId>
    <artifactId>jsf-api</artifactId>
    <version>2.2.20</version>
</dependency>
<dependency>
    <groupId>com.sun.faces</groupId>
    <artifactId>jsf-impl</artifactId>
    <version>2.2.20</version>
</dependency>
<dependency>
    <groupId>org.primefaces</groupId>
    <artifactId>primefaces</artifactId>
    <version>8.0.RC3</version>
    <!-- <version>8.0</version> -->
    <!-- <version>7.0</version> -->
    <!-- <version>7.0.RC3</version> -->
    <!-- <version>6.0</version> -->
    <!-- <version>6.1</version> -->
    <!-- <version>6.2</version> -->
</dependency>

-----------page_table.xml-----------

<h:form>
<p:dataTable var="car" value="#{sortViewBackingBean.cars}">
    <f:facet name="header">
        Single Column Sort
    </f:facet>
    <p:column headerText="Id" sortBy="#{car.id}">
        <h:outputText value="#{car.id}"/>
    </p:column>
    <p:column headerText="Year" sortBy="#{car.year}" filterBy="#{car.year}">
        <h:outputText value="#{car.year}"/>
    </p:column>
</p:dataTable>
</h:form>

----------汽车模型-------------

public class Car {
    private String id;
    private String brand;
    private int year;
    private String color;
    private int price;
    private boolean soldState;
    
    // Constructors, Getters, Setters
}

-----------汽车服务----------------

@Service(value = "carService")
public class CarService {
    private final static String[] colors;
    private final static String[] brands;
    // Populate colors, brands

    public List<Car> createCars(int size) {
        List<Car> list = new ArrayList<>();
        for (int i = 0; i < size; i++) {
            list.add(new Car(getRandomId(), getRandomBrand(), getRandomYear(),
                    getRandomColor(), getRandomPrice(), getRandomSoldState()));
        }
        return list;
    }
    // Other methods
}

-----------汽车服务----------------

----------SortViewBackingBean版本1------------

@Component(value = "sortViewBackingBean")
@Scope(value = WebApplicationContext.SCOPE_REQUEST, proxyMode = ScopedProxyMode.TARGET_CLASS)
/*
I overrode the Spring way, and I used CDI/JSF way, but it did not work as well
@Named("sortViewBackingBean")
@ManagedBean("sortViewBackingBean")
@ViewScoped
@SessionScoped
*/
public class SortViewBackingBean implements Serializable {
    private final List<Car> cars;
    private CarService carService;

    public SortViewBackingBean(CarService carService) {
        this.carService = carService;
// At creation of the bean, the cars is created once only!
        cars = this.carService.createCars(10);
    }

    @PostConstruct
    public void init() {
//      Or this version, as is in the primefaces showcase
//        cars = carService.createCars(10);
    }

    public List<Car> getCars() {
        return cars;
    }

    public void setService(CarService carService) {
        this.carService = carService;
    }
}

----------SortViewBackingBean版本2------------

@Component(value = "sortViewBackingBean")
@Scope(value = WebApplicationContext.SCOPE_REQUEST, proxyMode = ScopedProxyMode.TARGET_CLASS)
public class SortViewBackingBean implements Serializable {
    private List<Car> cars;
    private CarService carService;

    public SortViewBackingBean(CarService carService) {
        this.carService = carService;
    }

//  Or this version I found googling, the cars is created once only!
    public List<Car> getCars() {
        if (cars == null) {
            cars = this.carService.createCars(10);
        }
        return cars;
    }

    public void setService(CarService carService) {
        this.carService = carService;
    }
}

所以,好吧!这些特征在Primefaces工作,或它只是在我只有!有人能帮忙吗?

多谢

共有1个答案

商俊智
2023-03-14

根据您的代码:您需要使用比请求更长的作用域,如viewscope或sessionscope(不是两者)来保留filteredValue,以便筛选后仍可访问filtered list。例如。

@Named("sortViewBackingBean")
@SessionScoped

如果要对多个列进行排序,则需要通过将sortMode设置为Multiple来启用多重排序。在此模式下,当metakey处于on状态时单击排序列会将排序列添加到order组中。例如。

<p:dataTable var="car" value="#{carBean.cars}" sortMode="multiple">
    //columns
</p:dataTable>
 类似资料:
  • 我有一个使用apache myfaces 2.0.2的PrimeFaces 3.2数据表。我想要一个初始排序。我的JSF看起来像: 但是我得到一个当我删除其中的sortBy标记时,它工作得很好。 所以我的问题是:如何实现初始排序?

  • 我想对一个dataTable进行排序,该dataTable具有名为“CustomerName”的列,该列需要根据Customer的FirstName和LastName进行排序。因此,我希望将值传递给sortBy属性,如下所示sortBy=“customertable.firstname,customertable.lastname” 当我尝试此操作时,我得到一个解析器错误,说明该字符串 我可以用一

  • 我有一个自定义的dataTable标记,我在所有视图中都使用它,它位于这里:src/main/webapp/WEB-INF/tags/custom\u dataTable。xhtml 我的问题是,如果我对一个或多个可过滤列进行过滤,并使用dataExporter进行导出,则列过滤会丢失,因此导出会忽略这些额外的过滤。我怎样才能改变这个? 这是自定义datatable标记的源: 我的Primefac

  • 我在数据表外部有一个primefaces commandButton,它可以正常工作。在dataTable中,我有完全相同的commandButton,但当单击dataTable中的commandButton时,它不会调用ActionListener:

  • 我试图在PrimeFaces数据表上实现一个排序函数。我已经创建了一个模型对象列表。我们有一个问题是表的排序顺序。排序列包含整数和字符串值。当我应用等默认排序机制时,列表是基于ASCII顺序排序的。下面是排序结果的图像。我目前正在使用PrimeFaces V5.2.5 谁能指导我如何克服这个问题。

  • 我正在使用Primeface 4.0,我有一个具有多种选择功能的日期表。我愿意实现的是仅通过复选框按钮选择行,禁用单击行的功能。在当前场景中,即使我单击任何行,我也选中了复选框,我想禁用行选择。 我从这个论坛上得到了一些解决方案,但无法解决。请告诉我需要做什么。