【问题标题】:Primefaces datatable doesn't work with filter + sortPrimefaces 数据表不适用于过滤器 + 排序
【发布时间】:2018-07-12 13:46:31
【问题描述】:

我正在使用 primefaces Datatable 来显示大约 1000 行(和 7 列)。它工作得很快,但是当我过滤一列并尝试按不同的列对数据集进行排序时,我会出现奇怪的行为。 这是一个示例:在第一张图片中,加载了数据表,看起来很棒。它受到严格审查,因为我正在处理敏感数据。在第二张图片中,我过滤了 2 列,数据表在此之前工作正常,但如果我在那之后对第三列进行排序,我将停止工作,不会显示正确的行。我的数据中不存在此处显示的值(“não determinado”和许多白色字段)。

这是我的代码:

<p:dataTable var="prot" value="#{myBean.listaProtocolos}" rows="15" 
 sortBy="#{prot.dataEntradaArea}" sortFunction="#{myBean.sortXMLDatas}" 
 sortOrder="descending" paginator="true" style="font-size: 0.9em;" 
 paginatorPosition="bottom">
  <p:column filterBy="${prot.nrProtocolo}" filterMatchMode="contains" 
   width="8%" style="text-align:center">
    <f:facet name="header">ID</f:facet>
    <p:commandLink action="#{myBean.verDetalhesProtocolo}">
      <h:outputText value="#{prot.nrProtocolo}" 
       style="text-decoration: underline;"/>
      <f:setPropertyActionListener target="#{myBean.nrProtocolo}"
       value="#{prot.nrProtocolo}" />
    </p:commandLink>
  </p:column>
  <p:column filterBy="${prot.nrProcesso}" filterMatchMode="contains"
   width="10%">
    <f:facet name="header">Número</f:facet>
    <h:outputText value="#{prot.nrProcesso}" />
  </p:column>
  <p:column filterBy="${prot.tipoDeProtocoloDescricao}" 
   filterOptions="#{myBean.filtrosTipoDeProtocoloDescricao}" 
   width="10%">
    <f:facet name="header">Processo / Protocolo</f:facet>
    <h:outputText value="#{prot.tipoDeProtocoloDescricao}" />
  </p:column>
  <p:column filterBy="${prot.assunto}" sortBy="#{prot.assunto}"
   filterMatchMode="contains" width="30%">
    <f:facet name="header">Assunto</f:facet>
    <h:outputText value="#{prot.assunto}" />
  </p:column>
  <p:column filterBy="${prot.areaAtual}" sortBy="#{prot.areaAtual}"
   filterMatchMode="contains" width="15%">
    <f:facet name="header">Área Atual</f:facet>
    <h:outputText value="#{prot.areaAtual}" />
  </p:column>
  <p:column filterBy="${prot.tipo}" sortBy="#{prot.tipo}"
   filterMatchMode="contains" width="17%">
    <f:facet name="header">Tipo</f:facet>
    <h:outputText value="#{prot.tipo}" />
  </p:column>
  <p:column filterBy="${prot.dataEntradaAreaFormatada}" 
   sortBy="#{prot.dataEntradaArea}" sortFunction="#{myBean.sortXMLDatas}"
   filterMatchMode="contains" width="10%" style="text-align:center">
    <f:facet name="header">Data de Entrada</f:facet>
    <h:outputText value="#{prot.dataEntradaAreaFormatada}" />
  </p:column>
</p:dataTable>

我正在使用 primefaces v6.0。 myBean 是 @SessionScoped。

为什么会发生这种行为?

【问题讨论】:

    标签: java primefaces datatable


    【解决方案1】:

    我注意到您在 p:datatable 标记中遗漏了一个重要值,即 filtersValue="" 这是另一个类似于 value="" 的列表,其中包含过滤后的值。

    filteredValue="#{myBean.filteredListaProtocolos}"
    

    【讨论】:

    • 非常感谢,这有效。另外我想说我们应该在不实例化列表的情况下添加 getter 和 setter,例如filtersListaProtocolos(我做了实例化,它开始表现得很尴尬):)
    【解决方案2】:

    去年我也遇到过类似的问题。我设法做了一个解决方法(我对此不太满意)使用filterFunction=#{mbean.filter} 并制作我自己的过滤器功能。

    【讨论】:

    • 谢谢!我会为每种类型添加一个 filterFunction 并尝试一下!
    • @melloware 回答时我正在编码。他的想法很有效,所以我放弃了创建过滤器。感谢您的帮助!
    猜你喜欢
    • 2011-09-22
    • 2014-07-19
    • 2015-07-01
    • 1970-01-01
    • 2016-04-08
    • 2015-03-31
    • 2013-12-23
    • 2014-01-04
    • 1970-01-01
    相关资源
    最近更新 更多