在PrimeFaces数据表中设置默认值过滤器

7

我正在使用PrimeFaces v3.5版本。在数据表格上,我正在使用一个列的过滤器。如何在加载页面时为过滤器设置默认值。

4个回答

14
使用Primefaces中column标签的filterValue属性,类似于:
<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>    

10
正确的解决方案是使用p:dataTablefilteredValue属性,该属性包含与p:columnfilterValue属性一起显示过滤器配置给用户的过滤集合。
为了保留您的p:dataTable过滤器存储在会话Bean中,您还需要保留经过筛选的数据。 p:dataTable不会为您执行初始排序。
请查看此JSF示例:
<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;
    }
}

@SessionScoped 可能有些“大”,在这里使用 @ViewScoped 完全可以,并且有效。请参考 @BalusC 的帖子:https://dev59.com/fGw05IYBdhLWcg3wykvn - Roland
1
此解决方案设置了过滤器值,但未调用过滤。 - Milgo

2

当实现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());
                }
            }
        }
.....

在这个例子中,我在XHTML文件中添加了过滤列p:column...:
filterValue="true" // 是我为默认过滤器设置的值

1
理想情况下,获取到数据表的引用(可以通过将视图数据表绑定到后端 bean 表示或遍历 DOM 树来实现),并执行此操作。
    Map<String,String> theFilterValues = new HashMap<String,String>();
    theFilterValues.put("filterColumn","fooValue");
    myDataTable.setFilters(theFilterValues);

将设置默认文本值,但可能不应用过滤器。
或者,此帖子在primefaces问题队列中建议使用基于jquery的选项。
    <script>
        jQuery(document).ready(function() {
        jQuery('input[id*="datumCol"]').val('2012-07-17');
         });
    </script>

1
这样的话默认值会设置在过滤值中。但是它没有起作用。 - Ssv
@kolussus:我正在尝试使用脚本函数获取默认值,但是datatable的加载方法没有得到结果。 - Ssv
@Sagar 尝试使用 $('#yourDesiredColumnId\\:filter').trigger('keyup') 手动触发筛选器的键盘弹起事件,以实现筛选效果。 - kolossus

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接