Чтобы дать вам пример того, как я достиг пользовательской логики фильтра в моей таблице данных 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.