【问题标题】:Getting the filtered list in datatable获取数据表中的过滤列表
【发布时间】:2012-02-07 11:36:46
【问题描述】:

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

在 Primefaces 2.2.1 和 JSF 2 中有没有这样做?如果不能,您能否推荐针对这种情况的解决方法?

提前致谢。

【问题讨论】:

  • 实际上并没有一种方法可以自动执行此操作,但是通过一些自定义过滤逻辑,我能够将列过滤与异步更新过滤器按钮和字段结合使用,从托管中过滤掉数据对象豆。您可以将自定义过滤器字段放在表格标题中,<f:facet name="header"> ... </f:facet>
  • 那么您所做的就是自己进行过滤?

标签: jsf-2 datatable primefaces


【解决方案1】:

为了举例说明我是如何在我的 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>

在没有真正详细介绍托管 bean 代码的情况下,命令按钮的操作本质上是将过滤器参数传递给我的 BO 层,该层重新查询数据库以获取 beans 的新列表。刷新数据需要dataTable组件的显式update

您会注意到,在未隐藏的显式 Beanchild 过滤器按钮上,我有一个 oncomplete 属性,它引用了一个名为 refreshFilters() 的 JavaScript 函数。我不记得我遇到的确切问题,但我认为这是 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。

【讨论】:

    猜你喜欢
    • 2014-11-12
    • 1970-01-01
    • 2011-09-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-11-17
    • 2015-02-19
    • 1970-01-01
    相关资源
    最近更新 更多