带<p:selectonemenu>的全局<p:datatable>过滤器将无效</p:selectonemenu> </p:datatable>

时间:2013-10-24 13:18:26

标签: jsf java-ee primefaces filter datatable

我正在尝试在我的jsf页面上的数据表上实现全局过滤器。 输入文本过滤器可以正常使用以下代码:

<p:inputText id="globalFilter" onkeyup="examTable.filter();" style="width:200px" />

但是当我使用SelectOneMenu组件尝试相同的方法时,它将不起作用。

我试过这段代码:

<p:selectOneMenu id="state" value="#{examenListBean.stateOption}"onchange="examTable.filter();"> 

      <f:selectItems value="#{examenListBean.etatExamOptions}"/> 

</p:selectOneMenu>

但没有用。

这是我的p:datatable标签:

 <p:dataTable id="tabexam"
              paginatorPosition="bottom"
              var="exam"
              value="#{examenListBean.listexam}"
              widgetVar="examTable"
              emptyMessage="Aucun résultat n'a été trouvé avec les critères donnés"
              filteredValue="#{examenListBean.filteredexams}"
              paginator="true"
              rows="30" 
              paginatorTemplate="{CurrentPageReport} {FirstPageLink} {PreviousPageLink} {PageLinks} {NextPageLink} {LastPageLink} {RowsPerPageDropdown}"  
              rowsPerPageTemplate="5,10,15,30"
              resizableColumns="true">

2 个答案:

答案 0 :(得分:2)

尝试在服务器端过滤:

<p:selectOneMenu id="state" value="#{examenListBean.stateOption}"> 
            <f:selectItems value="#{examenListBean.etatExamOptions}"/> 
            <p:ajax event="change" process="@this" listener="#{myBean.filteringMethod}" update=":absPath:tabexam"/>
</p:selectOneMenu>

不知道您的JavaScript方法是什么样的,可以尝试使用<p:remoteCommand>并在那里更新您的表格。

答案 1 :(得分:2)

我遇到了同样的问题,而且似乎只是表面不允许它类型的东西。我的最终目标是能够将'selectOneMenu'表格从列中移出并将它们放入标题中,但此时此刻就是我所做的。

这是由于primefaces似乎访问它的结构,准备他们为过滤器做好准备。

我所做的是创建了一个'隐藏'的p:inputText字段,其id ='globalFilter'并且id为display:none ...

然后创建了2个搜索字段(一个使用selecOneMenu,另一个只使用inputText字段)。 然后使用这些类型的onchange或onkeyup函数来调用我的javascript函数,这些函数使用jQuery将隐藏字段更新为所选值,然后调用crpTable函数。

<script type="text/javascript">

        function doFilter1()
        {
            $("#globalFilter").val($("#globalFilter1").val());
            widgetVarTableId.filter();
        };
        function doFilter2()
        {
            $("#globalFilter").val($("#globalFilter2").val());
            widgetVarTableId.filter();
        };

</script>

<style>
   .myGlobalFilter {
      display:none;       
   }

</style>

在我的f:facet name = Header中有

<p:inputText id="globalFilter" styleClass="myGlobalFilter"/>

<h:outputText value="filter one: "/>
<h:selectOneMenu id="globalFilter1" onchange="doFilter1();">
   <f:selectItems value="#{formBean.filterOptions}" />
</h:selectOneMenu>

<h:outputText value="filter two: "/>
<p:inputText id="globalFilter2" onkeyup="doFilter2();">

这正如我所期望的那样..但是使用primefaces .filter()的时间很短 - 你不能将它改为'exact''startsWith'等,它总是'包含'而没有修改PF源码。

希望这有帮助!