0

我决定在这里问,所以我会解决我的问题。在我写信给你之前,我可以确保我搜索了很多,但没有找到答案。

在我的情况下,在 PRIMEFACES 中,p:dataTable 中的 p:column 中的 sortBy 和 filterBy 不起作用。

让我们从 sortBy 开始。( ) 在我尝试的所有版本中,正如您在以下 pom.xml 中看到的那样:6.2、7.0、7.0.RC3、8.0、8.0.RC3,它具有以下行为:它显示列 headerText,带有 2 个向上/向下箭头. 当我单击箭头时,它们不会在“向下”之后更改“向上”。显然没有排序正在发生。( ) 仅在您在以下 pom.xml 中看到的版本中:6.0、6.1 它具有这种行为:它显示列 headerText,带有 2 个向上/向下箭头。当我单击箭头时,它们确实会在“向下”之后更改为“向上”。但是再次没有排序发生。

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

下面我写了我使用的所有文件...我使用 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
}

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

这是代码的核心......正如我所写,我使用 Spring bean(SortViewBackingBean 中的前 2 个注释)。但是,我覆盖了 Spring 方式,一次使用 CDI / JSF 方式,但效果不佳(SortViewBackingBean 中的注释注释)。

现在,我将向您展示如何使用列表“汽车”为 DataTable 提供数据。谷歌搜索我发现只有当我们为数据表提供相同的列表时,排序才能工作。如果每次 tye 列表都不同,则排序不起作用...这就是为什么,正如您在以下代码中看到的,在 2 个版本中...这些版本中没有一个工作...

-------------- 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 中的这些功能有效,或者仅在我身上!有人可以帮忙吗?

非常感谢

4

1 回答 1

0

根据您的代码:您需要使用比请求更长的范围,例如 viewscope 或 sessionscope (不能同时使用两者)来保留filteredValue,以便过滤后的列表仍然可以访问。例如

@Named("sortViewBackingBean")
@SessionScoped

如果要对多列进行排序,则需要通过将 sortMode 设置为 multiple 来启用多重排序。在此模式下,在元键打开时单击排序列会将排序列添加到订单组。例如

<p:dataTable var="car" value="#{carBean.cars}" sortMode="multiple">
    //columns
</p:dataTable>
于 2020-08-19T10:50:35.933 回答