我正在尝试使用列中的过滤器字段过滤数据表并获取过滤列表(填充数据表)并根据我页面中已过滤列表的值更新另一个组件(Toplam TL Teminati和Toplam Dolar Teminati)。 / p>
在Primefaces 2.2.1和JSF 2中有没有这样做?如果没有,你能否为这个案例推荐一个解决方法?
提前致谢。
答案 0 :(得分:2)
为了举例说明我在Primefaces 2.2.1 dataTable中如何实现自定义过滤器逻辑,我将为您提供我的代码的缩放版本。
<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>
如果没有真正详细介绍托管bean代码,命令按钮的操作实际上是将过滤器参数传递给我的BO层,该层为新beans
列表重新查询数据库。刷新数据需要dataTable组件的显式update
。
您会注意到,在未隐藏的显式Beanchild过滤器按钮上,我有一个oncomplete
属性,该属性引用了一个名为refreshFilters()
的javascript函数。我不记得我遇到的问题,但我认为当存在列过滤器值并且在dataTable本身内发生异步更新时,这是Primefaces 2.2.1版本中的一个错误。这是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();
}
}
您可以在此处看到我正在查找具有类filtertag
的每个DOM元素,这将是列过滤器。我说如果在服务器操作完成后该字段中存在一个值,那么我手动触发keyup
事件,因为这将使用之前的值“重新过滤”该列。
我不确定在Primefaces的更高版本中是否有必要,我现在甚至不确定它是否有必要,所以我建议尝试在没有Javascript解决方法的情况下执行此操作,如果遇到问题,那么可以将两者合并,那么你可以考虑使用Javascript。