获取数据表中的筛选列表

时间:2012-02-07 11:36:46

标签: jsf-2 datatable primefaces

我正在尝试使用列中的过滤器字段过滤数据表并获取过滤列表(填充数据表)并根据我页面中已过滤列表的值更新另一个组件(Toplam TL Teminati和Toplam Dolar Teminati)。 / p>

enter image description here

在Primefaces 2.2.1和JSF 2中有没有这样做?如果没有,你能否为这个案例推荐一个解决方法?

提前致谢。

1 个答案:

答案 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。