6

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

4

4 回答 4

12

在 primefaces 中使用列标记的 filterValue 属性,例如

<p:datatable ... widgetVar="dataTableWidgetVar">
<p:column  ...    filterValue="#{BackingBean.defaultValue}">

然后,在页面准备就绪时,在 javascript 中创建一个简单的函数调用来触发过滤器(小部件变量是通过 PF 中的 jQuery 创建的):

<script  type="text/javascript" target="body">
$j = jQuery;
$j(document).ready( function() {
dataTableWidgetVar.filter();   
});
</script>    
于 2013-09-16T21:10:41.070 回答
10

正确的解决方案是使用包含过滤集合的filteredValue属性和属性来向用户显示过滤器配置。p:dataTablefilterValuep:column

要将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;
    }
}
于 2015-02-27T21:56:21.523 回答
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>
于 2013-03-17T00:11:14.167 回答
1

在实现 LazyDataModel 时,我在类构造函数中为类变量添加了一个默认过滤器。在此示例中,类变量称为“filters”,过滤是在值为“true”的“isActive”字段上完成的:

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" // 是我为默认过滤器设置的值

于 2018-02-02T17:56:23.577 回答