Фильтр для нескольких открытых таблиц 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); 
} 
Другие вопросы по тегам