【问题标题】:setting default value in primefaces datatable Filter在 primefaces 数据表过滤器中设置默认值
【发布时间】:2013-03-05 05:20:05
【问题描述】:

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

【问题讨论】:

    标签: jsf jsf-2 primefaces


    【解决方案1】:

    在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>    
    

    【讨论】:

      【解决方案2】:

      正确的解决方案是使用包含过滤集合的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 的帖子:stackoverflow.com/questions/7031885/…
      • 此解决方案确实设置了过滤器值,但不调用过滤。
      【解决方案3】:

      理想情况下,获取对数据表的引用(通过将视图数据表绑定到支持 bean 表示或遍历 DOM 树)并执行此操作

          Map<String,String> theFilterValues = new HashMap<String,String>();
          theFilterValues.put("filterColumn","fooValue");
          myDataTable.setFilters(theFilterValues);
      

      将设置默认文本值,但可能不会应用过滤器。

      另外,primefaces 问题队列中的this post 建议使用基于 jquery 的选项

          <script>
              jQuery(document).ready(function() {
              jQuery('input[id*="datumCol"]').val('2012-07-17');
               });
          </script>
      

      【讨论】:

      • :这种方式默认值是在过滤器值中设置的。但它不起作用
      • @kolussus:通过使用脚本函数,我正在尝试获取默认值。但是datatable的load方法没有得到结果
      • @Sagar尝试$('#yourDesiredColumnId\\:filter').trigger('keyup')手动触发filter keyup过滤事件,达到过滤效果
      【解决方案4】:

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

      【讨论】:

        猜你喜欢
        • 2014-11-16
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2019-03-04
        • 2018-07-18
        • 1970-01-01
        相关资源
        最近更新 更多