给出以下主要数据
<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>
如何(在服务器端)获取过滤器文本列中用户给出的过滤器“Text”值?
我试图用“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作为绑定组件,还是?
感谢
答案 0 :(得分: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}") ...
}
答案 1 :(得分:1)
我通常做的是使用实际的DataModel来提供给dataTable组件,而不是使用普通的集合,就像你似乎正在做的那样(你没有发布你的其余bean)。我扩展了LazyDataModel类并覆盖了load()方法,其签名为:
public List load(int first, int size, String column, SortOrder order, Map<String, String> filter);
在这种情况下,过滤器字段(map)包含用户在每个过滤器上输入的内容。此外,您不需要任何过滤器的ajax侦听器。我在我的项目中使用它,它工作得很好。如果您需要进一步的帮助,请与我们联系。