Primefaces标头中的数据表过滤器特定列

时间:2018-03-26 14:32:30

标签: primefaces jsf-2

在Primefaces数据表中,它可以通过以下代码过滤特定列:

<p:column filterBy="#{car.id}" headerText="Id" filterMatchMode="contains">
    <h:outputText value="#{car.id}" />
</p:column>

上面的代码将在列的标题上生成一个过滤器。我想要的是在数据表的标题上创建一个过滤器,而不是列。从ShowCase开始,有一个代码:

<f:facet name="header">
    <p:outputPanel>
        <h:outputText value="Search all fields:" />
        <p:inputText id="globalFilter" onkeyup="PF('carsTable').filter()"/>
    </p:outputPanel>
</f:facet>

这会在datatable的标题中放置一个过滤器,但它会过滤数据表的所有字段,这是我不想要的,我希望它只过滤特定列,是否可能?

1 个答案:

答案 0 :(得分:1)

你可以使用几个黑客。首先向widgetVar添加p:dataTable属性,例如widgetVar="myTable"。然后,为id添加p:column属性:

<p:column filterBy="#{car.id}"
          headerText="Id"
          filterMatchMode="contains"
          id="clm">
  <h:outputText value="#{car.id}" />
</p:column>

您可以使用此ID选择列过滤器字段。在全局过滤器中,您要删除id属性,并添加onkeyup侦听器,该侦听器在列的过滤器中设置输入值,并使用widgetVar触发对表的过滤。 / p>

<f:facet name="header">
  <p:inputText onkeyup="document.getElementById('frm:tbl:clm:filter').value=this.value; PF('myTable').filter();"/>
</f:facet>

我假设您的表单的ID为frm,而您的数据表的ID为tbl。它们可能具有不同的ID,因此请相应地更改代码。

如果您不希望过滤器在列中可见,您可以使用CSS规则隐藏它:

.ui-datatable .ui-column-filter[id='frm:tbl:clm:filter'] {
  display: none;
}

如果您使用延迟加载,还可以查看Primefaces lazy datatable: put my own filter instead of GlobalFilter