我决定在这里问,所以我会解决我的问题。在我写信给你之前,我可以确保我搜索了很多,但没有找到答案。
在我的情况下,在 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 中的这些功能有效,或者仅在我身上!有人可以帮忙吗?
非常感谢