我正在使用PrimeFaces v3.5版本。在数据表格上,我正在使用一个列的过滤器。如何在加载页面时为过滤器设置默认值。
我正在使用PrimeFaces v3.5版本。在数据表格上,我正在使用一个列的过滤器。如何在加载页面时为过滤器设置默认值。
<p:datatable ... widgetVar="dataTableWidgetVar">
<p:column ... filterValue="#{BackingBean.defaultValue}">
然后,在页面准备就绪时(widget vars是通过jQuery在PF中创建的),创建一个简单的JavaScript函数调用来触发过滤器:
<script type="text/javascript" target="body">
$j = jQuery;
$j(document).ready( function() {
dataTableWidgetVar.filter();
});
</script>
p:dataTable
的filteredValue
属性,该属性包含与p:column
的filterValue
属性一起显示过滤器配置给用户的过滤集合。p:dataTable
过滤器存储在会话Bean中,您还需要保留经过筛选的数据。 p:dataTable
不会为您执行初始排序。<p:dataTable
value="#{usersBean.employees}"
var="e"
filteredValue="#{userListState.filteredValue}">
<p:ajax event="filter" listener="#{userListState.onFilterChange}"/>
<p:column
headerText="user"
filterBy="#{e.user.id}"
filterValue="#{userListState.filterState('user.id')}">
#{e.user.id}
</p:column>
</p:dataTable>
使用此托管Bean进行支持:
@Named(value = "userListState")
@SessionScoped
public class UserListState implements Serializable{
private Map<String, String> filterState = new HashMap<String, String>();
private List<Employee> filteredValue;
public UserListState() {
}
public void onFilterChange(FilterEvent filterEvent) {
filterState = filterEvent.getFilters();
filteredValue =(List<Employee>) filterEvent.getData();
}
public String filterState(String column) {
return filterState.get(column);
}
public List<Employee> getFilteredValue() {
return filteredValue;
}
public void setFilteredValue(List<Employee> filteredValue) {
this.filteredValue = filteredValue;
}
}
当实现LazyDataModel时,我在类构造函数中向一个类变量添加了一个默认过滤器。在这个例子中,类变量名为“filters”,并且对“isActive”字段的值为“true”进行过滤:
public class ExtendedLazyListModel<T> extends LazyDataModel<T> {
private final List<T> datasource;
private Map<String, Object> filters;
public ExtendedLazyListModel(List<T> datasource) {
this.filters = new HashMap<>();
filters.put("isActive", "true");
this.datasource = datasource;
this.setRowCount(datasource.size());
}
然后在Load方法中,我添加了以下代码来设置默认过滤器(仅适用于第一次调用):
public List<T> load(int first, int pageSize, String sortField, SortOrder sortOrder, Map<String, Object> filters) {
//set default filter
if (filters.isEmpty()){
for (Field f : datasource.get(0).getClass().getDeclaredFields() ){
if (this.filters.containsKey(f.getName())) {
filters.put(f.getName(), this.filters.get(f.getName()));
this.filters.remove(f.getName());
}
}
}
.....
Map<String,String> theFilterValues = new HashMap<String,String>();
theFilterValues.put("filterColumn","fooValue");
myDataTable.setFilters(theFilterValues);
<script>
jQuery(document).ready(function() {
jQuery('input[id*="datumCol"]').val('2012-07-17');
});
</script>
$('#yourDesiredColumnId\\:filter').trigger('keyup')
手动触发筛选器的键盘弹起事件,以实现筛选效果。 - kolossus
@SessionScoped
可能有些“大”,在这里使用@ViewScoped
完全可以,并且有效。请参考 @BalusC 的帖子:https://dev59.com/fGw05IYBdhLWcg3wykvn - Roland