Динамически устанавливаемый стиль ячейки / строки jsf 2.0

#jsf #datatable

#jsf #datatable

Вопрос:

Я использую h: datatable, который показывает сводку данных, введенных пользователем в сеансе. Строки таблицы могут быть удалены по усмотрению пользователя. если данные соответствуют определенному критерию, конкретная строка в таблице должна быть красного цвета шрифта, иначе она должна быть черной.

Методы, которые я пробовал до сих пор, следующие: — Программно установите значение стиля для компонента h: outputtext в каждом значении столбца на красный. Но это меняет цвет целых столбцов. — Установите классы строк программно, это снова изменит стиль для всех предыдущих строк.

Я не могу настроить таргетинг только на одну строку или ячейку. Я думал об использовании javascript, но без идентификатора компонента я не уверен, как получить элемент.

Спасибо.

Ответ №1:

Используйте rowClasses атрибут.

 <h:dataTable value="#{bean.items}" var="item" rowClasses="#{bean.rowClasses}">
  

getRowClasses() Должен возвращать разделенную запятыми строку имен классов CSS, которые должны применяться к строкам (точнее, к <tr> элементам) повторно. Вы можете создать его на основе items конструктора (post) внутреннего компонента, методов действий и / или даже внутри средства получения.

Комментарии:

1. В целом, строки таблицы добавляются асинхронно, когда пользователь нажимает кнопку для запуска действия. Таким образом, при загрузке представления не загружается вся таблица. Итак, пользователь вводит данные, нажимает кнопку, заполняется первая строка. Пользователь снова вводит данные и нажимает кнопку, а вторая строка добавляется в таблицу и так далее. Используя rowclasses, мне нужно было бы добавить класс строки для каждой строки и убедиться, что я удаляю эти классы строк, когда пользователь удаляет строку. Я все равно попробую и посмотрю, как это работает.

2. Используете ли вы JSF ajax для этой или какой-либо сторонней библиотеки / фреймворка JavaScript?

3. Ну, тогда представление синхронизировано с моделью, поэтому я не предвижу проблем.

4. Хорошо, итак, это то, что я пробовал. В действии, запускаемом кнопкой для добавления строк, скажем, «addRows», я создаю StringBuffer. Когда данные соответствуют / не соответствуют критерию, я добавляю соответствующий класс стилей в StringBuffer и вызываю Table.setRowClasses(StringBuffer.toString()). Но самый последний добавленный класс стилей переопределяет все остальные классы стилей и делает все строки одинаковыми по стилю.

5. Я должен также упомянуть, что кнопка представляет собой a4j:CommandButton, которая использует атрибут render для повторного отображения таблицы onclick.

Ответ №2:

По какой-то причине StringBuffer перезаписывался, поэтому изменение не отображалось. Я выбрал более простой подход, добавив img предупреждения к строкам, которые необходимо было изменить.