3

给定以下primefaces数据

<p:dataTable value="#{cc.attributes.playerCollection}" var="player"
    widgetVar="playerWidgetTable" emptyMessage="#{uimsg.ui_not_recordsfound}">
    <!-- filter event handler  -->
    <p:ajax event="filter" listener="#{cc.attributes.viewBean.listenFilter}" update="@this"/>

    <!-- Player first name  -->
    <p:column id="firstnameColumn" headerText="#{uimsg.firstname}"
        filterBy="#{player.firstName}" filterMatchMode="contains">
        <h:outputText value="#{player.firstName}" />
    </p:column>
</p:dataTable>

某人如何(在服务器端)获得用户在过滤器文本列中给出的过滤器“文本”值?

我试图用“listenFilter”收听过滤器事件:

@ManagedBean
@ViewScoped
public class PlayerListBean implements Serializable {

......

    public void listenFilter(FilterEvent event) {
        // update datasource
        Map<String, String> tempString = event.getFilters();

        System.out.println("size filter: "+ tempString.size());
        for (String key : tempString.keySet()) {
            System.out.println("key: " + key + " \t values: "
                    + tempString.get(key));

        }

    }

}

但我不能从它开始。他们还有其他选择吗?喜欢将 DataTable 作为绑定组件使用,或者?

谢谢

4

2 回答 2

3

这对我来说很好......

public void listenFilter(FilterEvent event) {

    DataTable table = (DataTable) event.getSource();
    Map<String, String>  filters = table.getFilters();
    //grab the value from the required map key (somePropertyName if your filterBy 
     looks like filterBy="#{myBean.somePropertyName}") ... 

}
于 2012-11-13T18:30:50.883 回答
1

我通常做的是使用实际的 DataModel 来提供给 dataTable 组件,而不是使用普通的集合,就像你似乎在做的那样(你没有发布你的 bean 的其余部分)。我扩展了 LazyDataModel 类并覆盖了 load() 方法,其签名是:

public List load(int first, int size, String column, SortOrder order, Map<String, String> filter);

在这种情况下,过滤器字段(地图)包含用户在每个过滤器上输入的任何内容。此外,您实际上并不需要过滤器的任何 ajax 侦听器。我在我的项目中使用它,它工作得很好。如果您需要进一步的帮助,请告诉我。

于 2012-11-13T18:12:33.823 回答