Фильтр для нескольких открытых таблиц Faces
У меня есть 3 openFaces <o:datatable />
на той же странице просмотра (Overview.xhtml).
- Первый отображает список всех музыкальных групп
- 2d отображает список всех песен, написанных музыкальными группами
- 3d отображает список всех шоу музыкальных групп
я использую <o:inputTextFilter />
отфильтровать первый набор данных, используя идентификатор строки (
<h:form>
<o:datatable value="#{bandBean.items}" var="band" ........<o:inputTextFilter
expression="#{band.id}" .../>
</h:form>
<h:form>
<o:datatable value="#{showBean.items}" var="show" ........<o:inputTextFilter
expression="#{band.id}" .../>
</h:form>
<h:form>
<o:datatable value="#{songBean.items}" var="song" ........<o:inputTextFilter
expression="#{band.id}" .../>
</h:form>
Песни и шоу являются детскими объектами музыкальных групп. Что мне действительно нужно, так это возможность фильтровать 3 таблицы данных, используя один и тот же inputTextFilter или что-то похожее, так как каждый из 3 таблиц данных имеет столбец с идентификатором полосы.
Пользователь никогда не допустит трехкратного ввода идентификатора группы, первого раза для таблицы BAND, второго раза для таблицы шоу и третьего раза для таблицы песен, используя 3 фильтра. Вместо этого он хочет набрать один раз идентификатор группы, и сразу 3 таблицы фильтруются.
Один обходной путь будет использовать три <o:inputTextFilter />
и установите их значения с помощью javascript или ajax: пока пользователь вводит что-то в фильтр, вводимое значение немедленно добавляется к другим фильтрам. Я не могу понять этот обходной путь. все же кажется странным показывать 3 фильтра, в то время как пользователь должен использовать только один. Любые идеи и помощь будут ценны!
1 ответ
Нет прямой поддержки для прикрепления фильтра к нескольким таблицам, однако вы можете смоделировать это поведение. Для этого вы можете прикрепить скрытый ("display: none") к каждой из ваших таблиц, используя атрибут "for", и указать значение фильтрации для всех них программно.
Вот простой фрагмент кода, который демонстрирует эту идею:
<o:inputText value="#{MyBean.filterText}"/>
<o:commandButton value="Submit" action="#{MyBean.filterAllTables}"/>
<o:inputTextFilter for="table1" expression="#{book.bookTitle}"
value="#{MyBean.filterCriterion}" style="display: none"/>
<o:inputTextFilter for="table2" expression="#{book.bookTitle}"
value="#{MyBean.filterCriterion}" style="display: none"/>
<o:dataTable id="table1" ...>
<o:dataTable id="table2" ...>
MyBean.java:
private String filterText; // a property w/ getter/setter
private ExpressionFilterCriterion filterCriterion; // a property w/ getter/setter
public void filterTables() {
String filterText = getFilterText();
SimplePropertyLocatorFactory.SimplePropertyLocator propertyLocator =
new SimplePropertyLocatorFactory.SimplePropertyLocator("id"); // "id" is a property name by which you'd like to filter
ExpressionFilterCriterion filterCriterion = new ExpressionFilterCriterion(
propertyLocator, FilterCondition.CONTAINS, filterText);
setFiterCriterion(filterCriterion);
}