JSF Primefaces全局过滤器的数据表匹配模式(不是单个列)

时间:2013-12-27 12:26:45

标签: jsf jsf-2 primefaces filter datatable

global filter的过滤器匹配模式是什么(不是默认为'startsWith'的单个列过滤器)以及如何更改它?

我问的原因是,当我在所有列中使用匹配模式设置为'startsWith'的全局过滤器时,仍然可以使用'包含'过滤模式获取值。见下面的截图。

country table screenshot

我不应该获取第一行以外的行,因为我在所有列中都指定了'startsWith'。

这是我的数据表,

<h:form id="countryTable">
<p:dataTable rowKey="" value="#{countryBean.countriesList}"
    var="country" selection="#{countryBean.selectedCountries}"
    styleClass="data-table-style" widgetVar="countryTableWVar"
    filteredValue="#{countryBean.filteredCountries}">
    <f:facet name="header">
        <div class="align-left">
            <p:outputPanel>
                <h:outputText value="Search all fields:" />
                <p:inputText id="globalFilter" onkeyup="countryTableWVar.filter();"
                    style="width:150px" />
            </p:outputPanel>
        </div>

    </f:facet>
    <p:column selectionMode="multiple" style="width:2%;" />
    <p:column headerText="Numeric Code" filterMatchMode="startsWith"
        filterStyle="display:none" filterBy="numericCode">
        <h:outputText value="#{country.numericCode}"></h:outputText>
    </p:column>
    <p:column headerText="Alpha_2 Code" filterMatchMode="startsWith"
        filterStyle="display:none" filterBy="alpha2">
        <h:outputText value="#{country.alpha2}"></h:outputText>
    </p:column>
    <p:column headerText="Alpha_3 Code" filterMatchMode="startsWith"
        filterStyle="display:none" filterBy="alpha3">
        <h:outputText value="#{country.alpha3}"></h:outputText>
    </p:column>
    <p:column headerText="Name" filterMatchMode="startsWith"
        filterStyle="display:none" filterBy="name">
        <h:outputText value="#{country.name}"></h:outputText>
    </p:column>
</p:dataTable>
</h:form>

如何更改数据表全局过滤器匹配模式?

2 个答案:

答案 0 :(得分:2)

如果你看一下primefaces的源代码

org.primefaces.component.datatable.feature.FilterFeature.java

在第133行,您可以看到primefaces使用contains

String方法
if(columnValue.toLowerCase(filterLocale).contains(globalFilter)){
    globalMatch = true;
}

所以现在除了根据你的需要改变代码并构建你自己的primefaces jar之外别无他法。

答案 1 :(得分:1)

来自Primefaces 4.0文档:

  

位于标题的过滤器是应用于所有字段的全局过滤器,这是通过调用客户端实现的   侧面API方法称为filter(),重要的部分是将输入文本的id指定为globalFilter   这是datatable的保留标识符。

用例将是:

<p:dataTable var="car" value="#{carBean.cars}" 
filteredValue="#{carBean.filteredCars}" widgetVar="carsTable">
    <f:facet name="header">
        <p:outputPanel>
            <h:outputText value="Search all fields:" />
            <h:inputText id="globalFilter" onkeyup="PF('carsTable').filter()" />
        </p:outputPanel>
    </f:facet>
    <p:column filterBy="model" headerText="Model" filterMatchMode="contains">
        <h:outputText value="#{car.model}" />
    </p:column>
    <p:column filterBy="year" headerText="Year" footerText="startsWith">
        <h:outputText value="#{car.year}" />
    </p:column>
    <p:column filterBy="manufacturer" headerText="Manufacturer" 
filterOptions="#{carBean.manufacturerOptions}" filterMatchMode="exact">
        <h:outputText value="#{car.manufacturer}" />
    </p:column>
    <p:column filterBy="color" headerText="Color" filterMatchMode="endsWith">
        <h:outputText value="#{car.color}" />
    </p:column>
</p:dataTable>

它没有说明全局过滤器的startsWithendsWith具体情况。在issue tracker上打开一个帖子可能会很有趣。