【问题标题】:Global <p:datatable> filter with <p:selectOneMenu> won't work带有 <p:selectOneMenu> 的全局 <p:datatable> 过滤器将不起作用
【发布时间】:2013-11-03 05:29:57
【问题描述】:

我正在尝试在我的 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">

【问题讨论】:

标签: jsf jakarta-ee primefaces filter datatable


【解决方案1】:

我也遇到过同样的问题,而且似乎只是 primefaces 不允许这种类型的事情。我的最终目标是能够将“selectOneMenu”表移出列并将它们放在标题中,但目前这是我所做的。

这是由于 primefaces 似乎访问其结构的方式使它们为过滤器做好准备。

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

然后创建了 2 个搜索字段(一个使用 selectOneMenu,一个仅使用 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()- 的缺点是您不能将其更改为“精确”“startsWith”等,它总是“包含”而不修改 PF 源代码。

希望这会有所帮助!

【讨论】:

  • 出色的工作谢谢你,虽然不幸的是“包含”。
【解决方案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 方法长什么样,也许可以尝试使用 &lt;p:remoteCommand&gt; 并在那里更新您的表格。

【讨论】:

  • 实际上我正在寻找一种过滤方式而不是对数据表进行排序,我也有服务器端过滤的工作方法,我需要的是客户端过滤,尤其是选择选项,因为我正在处理大量数据。
  • 虽然你的方法很快,而且很有用。
  • 然后在&lt;p:ajax&gt;标签上放置类似oncomplete的javascript回调。
  • 什么在您的代码中实际上不起作用,回调不会触发或您的 JS 方法不适用于&lt;p:selectOneMenu&gt;&lt;p:selectOneMenu ... onchange="console.log('hello')"&gt; 也不会触发?
  • 所以问题出在你的 JavaScript 上。使用一些开发人员工具来确定您是否使用 jQuery/JavaScript 在前端选择了正确的 ids/objects。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-11-11
  • 2022-08-18
  • 2012-12-29
  • 2015-08-01
  • 1970-01-01
相关资源
最近更新 更多