在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的标题中放置一个过滤器,但它会过滤数据表的所有字段,这是我不想要的,我希望它只过滤特定列,是否可能?
答案 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