Получение отфильтрованного списка в datatable - PullRequest
0 голосов
/ 07 февраля 2012

Я пытаюсь отфильтровать данные, используя поле фильтра в столбце, получить отфильтрованный список (который заполняет данные) и обновить другой компонент (Toplam TL Teminati и Toplam Dolar Teminati) в соответствии со значениями отфильтрованного списка на моей странице.

enter image description here

Есть ли способ сделать это в Primefaces 2.2.1 и JSF 2? Если нет, можете ли вы рекомендовать обходной путь для этого случая?

Заранее спасибо.

1 Ответ

2 голосов
/ 08 февраля 2012

Чтобы дать вам пример того, как я достиг пользовательской логики фильтра в моей таблице данных Primefaces 2.2.1, я даю вам уменьшенную версию моего кода.

    <p:dataTable value="#{listBeans.beans}" var="bean" dynamic="true" paginator="true" rows="20" paginatorPosition="bottom"
                 emptyMessage="No Beans" loadingMessage="Loading. . ." selectionMode="single" selection="#{listBeans.selectedBean}"
                 id="beanList" widgetVar="beanTable">
        <f:facet name="header">
            <h:panelGrid columns="4">
                <h:outputText value="Bean List" />
                <p:outputPanel>
                    <h:outputText value="Year Filter: " />
                    <h:selectOneMenu value="#{listBeans.yearFilter}"
                        onchange="yearFilterBtn.jq.click(); refreshFilters();">
                        <f:selectItems value="#{listBeans.years}" />

                    </h:selectOneMenu>
                    <p:commandButton id="yearFilterBtn" widgetVar="yearFilterBtn" action="#{listBeans.filterYears}"
                        update="listBeansForm:beanList" style="display:none;" />

                </p:outputPanel>
                <p:outputPanel>
                    <h:outputText value="Filter By Beanchild: " />
                    <p:inputText value="#{listBeans.beanchildFilter}" style="width: 150px; margin-right: 4px;" />
                    <!-- refreshFilters forces the visitor filter to refresh the selection if column filters are selected. -->
                    <p:commandButton oncomplete="refreshFilters();" value="Filter"
                        action="#{listBeans.filterBeanchildren}" update="listBeansForm:beanList" />
                </p:outputPanel>
                <p:commandButton value="Export to XLS" ajax="false">
                    <p:dataExporter target="beanList" type="xls" fileName="BeanReport"
                        excludeColumns="0,5,6" postProcessor="#{listBeans.postProcessExcelReport}" />
                </p:commandButton>
            </h:panelGrid>
        </f:facet>  

        <p:column style="width:16px">
            <p:rowToggler />
        </p:column>
        <p:column filterStyleClass="filtertag" filterBy="#{bean.beanDateDisplay}" filterMatchMode="startsWith">

....
    </p:dataTable>

Не вдаваясь в подробности о коде управляемого компонента, действия командной кнопки по сути передают аргументы фильтра моему слою BO, который запрашивает базу данных для нового списка beans. Явный update компонента dataTable необходим для обновления данных.

Вы заметите, что на явной кнопке Beanchild Filter, которая не скрыта, у меня есть атрибут oncomplete, который ссылается на функцию javascript с именем refreshFilters(). Я не могу точно вспомнить проблему, которая у меня была, но я думаю, что это ошибка в версии 2.2.1 Primefaces, когда существует значение фильтра столбца и происходит асинхронное обновление внутри самой таблицы данных. Вот функция JavaScript:

function refreshFilters() {
    var filters = jQuery('.filtertag');
    var uppedOnce = false;
    filters.each(function(idx) {
        var curEl = jQuery(this);
        if (curEl.val() != '') {
            curEl.keyup();
            uppedOnce = true;
        }
    });

    if (!uppedOnce) {
        jQuery(filters[0]).keyup();
    }           
}

Здесь вы видите, что я нахожу каждый элемент DOM, имеющий класс filtertag, который будет фильтром столбца. Я говорю, что если в этом поле есть значение после завершения действия сервера, то я вручную запускаю событие keyup, поскольку это «перефильтрует» столбец с предыдущим значением ранее.

Я не уверен, если это необходимо в более поздних версиях Primefaces, я даже не уверен, что это необходимо сейчас, поэтому я предлагаю попробовать сделать это без обходного пути Javascript, и если вы столкнетесь с проблемами, связанными между собой, то вы можете рассмотрите возможность использования Javascript.

...