#primefaces #primefaces-datatable
#primefaces #primefaces-datatable
Вопрос:
Я решил спросить здесь, чтобы решить свою проблему. Прежде чем я напишу вам, я могу заверить вас, что я много гуглил, но ответа не нашел.
В моем случае В PRIMEFACES sortBy и filterBy в столбце p: в p:DataTable не работают.
Давайте начнем с сортировки. () Во всех версиях, которые я пробовал, как вы видите в следующем pom.xml : 6.2, 7.0, 7.0.RC3, 8.0, 8.0.RC3, он имеет следующее поведение: он отображает текст заголовка столбца с двумя стрелками вверх / вниз. Когда я нажимаю на стрелки, они НЕ меняются на «вверх» после «вниз». И, очевидно, НИКАКОЙ СОРТИРОВКИ не происходит. () Только в версиях, которые вы видите в следующем pom.xml: 6.0, 6.1 у него такое поведение: он отображает текст заголовка столбца с двумя стрелками вверх / вниз. Когда я нажимаю на стрелки, они меняют «вверх» после «вниз». Но опять же, СОРТИРОВКА не выполняется.
В некоторых сообщениях говорилось, что сначала я должен применить фильтрацию, а в отфильтрованном списке произвести сортировку. Я пробовал с помощью 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
}
————— CarService —————
@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
}
————— CarService —————
Here is the heart of the code…
As I wrote I use Spring beans (the first 2 annotations in the SortViewBackingBean).
But, I overrode the Spring way, and I used CDI the one time / JSF way the other time,
but it did not work as well (the commented annotations in the SortViewBackingBean).
Сейчас я покажу вам, как я добавляю в DataTable список «автомобили». Погуглив, я обнаружил, что сортировка может работать, только если мы передаем datatable с тем же списком. Если каждый раз список отличается, сортировка не работает… Вот почему, как вы видите в следующем коде, в 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 работают, или это только у меня!
Кто-нибудь может помочь в этом, пожалуйста?
Большое спасибо
Комментарии:
1. ухххх … 8.0RC3 — это кандидат для реального использования, он старше 8.0. О, и JSF и Spring MCV являются «конкурирующими» технологиями.
2. Привет, Кукельтье. Я также пробовал 8.0. Я также пробовал ManagedBean. Ничего не работает, кроме версий 6.0, 6.1. Но они работали с иконками. Сортировка также отсутствует
Ответ №1:
Исходя из вашего кода: вам нужно использовать область длиннее, чем запрос, например viewscope или sessionscope (не оба), чтобы сохранить filteredValue, чтобы отфильтрованный список оставался доступным после фильтрации. например
@Named("sortViewBackingBean")
@SessionScoped
если вы хотите отсортировать более одного столбца, вам необходимо включить множественную сортировку, установив SortMode в значение multiple . В этом режиме щелчок по столбцу сортировки при нажатой metakey добавляет столбец сортировки в группу упорядочения.
например
<p:dataTable var="car" value="#{carBean.cars}" sortMode="multiple">
//columns
</p:dataTable>
Комментарии:
1. Привет, Луис Галаз. Спасибо за ответ. Я только что попробовал то, что вы предложили. Я поставил SessionScoped… Это не работает. О режиме сортировки я знаю. Я также не выполнял работу с несколькими…
2. можете ли вы удалить filterBy=»#{car.year}» и проверить, работает ли сортировка?
3. Я пытался. Это не работает… Имейте в виду, Luis, что я пробовал это в обеих версиях 8.0, 6.0… В версиях 6.0, 6.1 стрелки сортировки вверх / вниз меняются и реагируют на щелчок (сортировка не работает), но во всех других версиях стрелки остаются мертвыми, как на мертвом изображении…