【问题标题】:Filter a lazy dataTable with dynamic columns使用动态列过滤惰性数据表
【发布时间】:2014-06-12 09:38:49
【问题描述】:

我有一个带有动态列的数据表:

<p:dataTable id="bookings" var="booking" value="#{tableBean.dataModel}" 
    widgetVar="bookingTable" filteredValue="#{tableBean.filteredFields}"
    paginator="true" rows="15"
    lazy="true" rowsPerPageTemplate="15,30,50" type="none" draggableColumns="true">

[...]

<p:columns value="#{tableBean.columns}" var="column" columnIndexVar="colIndex"
           sortBy="#{booking.properties[column.property]}"
           filterBy="#{booking.properties[column.property]}"
           filterMatchMode="in"
           styleClass="telegrotesk">
    <f:facet name="header">
        <h:outputText value="#{column.header}"/>
    </f:facet>
    <f:facet name="filter">
        <p:selectCheckboxMenu label="#{column.header}" onchange="PF('bookingTable').filter()">
            <f:selectItems value="#{column.possibilities}" />
        </p:selectCheckboxMenu>
    </f:facet>
    <h:outputText value="#{booking.properties[column.property]}"/>
</p:columns>

列类似于 primefaces 示例 (http://www.primefaces.org/showcase/ui/data/datatable/filter.xhtml) 这个类:

static public class ColumnModel implements Serializable {

    private String header;
    private String property;
    private List<SelectItem> possibilities;

    public ColumnModel(Field property) {
        this.header = property.getName();
        this.property = property.getSqlName();
    }

    public String getHeader() {
        return header;
    }

    public String getProperty() {
        return property;
    }

    public List getPossibilities() {
        return possibilities;
    }

    public void setPossibilities(List<SelectItem> possibilities) {
        this.possibilities = possibilities;
    }
}

在我的示例中,仅测试一个动态列,显示创建预订的用户。它有效,在复选框下拉菜单中显示所有用户。当我选择一个或多个用户时,函数会加载

public List<Booking> load(int first, int pageSize, String sortField, SortOrder sortOrder, Map<String,Object> filters) {
    [...]
}

已执行,但过滤器始终为空!

ColumnModel 中的列表可能性是SelectItems 的集合。标签始终是用户名,用户对象的值。对于用户类,我定义了一个使用 @FacesConverter(forClass = User.class) 实现 javax.faces.convert.Converter 的 Converter 类

过滤器映射总是空的,我做错了什么?

编辑

当我这样做时

<p:columns value="#{tableBean.columns}" var="column" columnIndexVar="colIndex"
           sortBy="#{booking.properties[column.property]}"
           filterBy="#{booking.properties[column.property]}"
           filterMatchMode="in"
           filterOptions="#{column.possibilities}"
           styleClass="telegrotesk">

并且没有任何方面它可以正常工作,但我只能选择一个用户。

我正在使用 primefaces 5.0、jsf 2.2.1 和 glassfish v4

【问题讨论】:

    标签: jsf primefaces datatable filtering lazy-loading


    【解决方案1】:

    你没有做错,这是一个 Primefaces 错误。

    请给它加星,让我们尝试修复它。

    新的 PF5 增强过滤不适用于动态列: https://code.google.com/p/primefaces/issues/detail?id=6912

    解决方法:

    第 1 步:在 Primefaces 源 (https://code.google.com/p/primefaces/source/checkout) 中打开 FilterFeature.java。

    populateFilterMetaData(FacesContext context, DataTable table) 方法中,在第 300 行附近,替换:

    filterId = dynamicColumn.getContainerClientId(context) + separator + "filter";
    dynamicColumn.cleanStatelessModel();
    

    用这个:

    filterId = dynamicColumn.getContainerClientId(context) + separator + "filter";
    filterFacet = null;
    dynamicColumn.cleanStatelessModel();
    

    所以基本上你只需添加filterFacet = null;

    构建PF的提示:https://code.google.com/p/primefaces/wiki/BuildingFromSource

    第 2 步:在您的项目中,确保您在过滤器方面的输入组件的 id 为 filter

    例子:

    <f:facet name="filter">
        <p:selectOneButton id="filter" onchange="PF('recordTable').filter()" >
            <f:converter converterId="javax.faces.Boolean" />
            <f:selectItem itemLabel="All" itemValue="" />
            <f:selectItem itemLabel="True" itemValue="true" />
            <f:selectItem itemLabel="False" itemValue="false" />
        </p:selectOneButton>
    </f:facet>
    

    【讨论】:

      【解决方案2】:

      是的,可以在 primefaces 4.0 版本的动态列中进行过滤选项

      <p:columns value="#{pc_searchJobBean.columns}" var="column"
                                                  id="searchJobColumns" columnIndexVar="colIndex"
                                                  rendered="#{column.property eq 'minWorkExp' or column.property eq 'maxWorkExp' or column.property eq 'minSalary'
                                                  or column.property eq 'maxSalary'}"
                                                  filterBy="#{tbl[column.property]}" filterOptions="#{column.items}">
      
                                                  <f:facet name="header">
                                                      <h:outputText value="#{column.header}" escape="false">
                                                      </h:outputText>
                                                  </f:facet>
      
                                                  <h:outputText value="#{tbl[column.property]}" escape="false"
                                                      rendered="#{column.header!='Priority'}">
                                                      <f:convertDateTime
                                                          pattern="#{userSettingBean.userSettingVO.dateFormat}" />
                                                  </h:outputText>
      
                                              </p:columns>
      

      Java 代码...

      public static class ColumnModel {
      
              private String header;
              private String property;
              private SelectItem[] items;
      
              public ColumnModel(String header, String property, SelectItem[] items) {
                  super();
                  this.header = header;
                  this.property = property;
                  this.setItems(items);
              }
      
              public ColumnModel(String header, String property) {
                  this.header = header;
                  this.property = property;
              }
      
              public String getHeader() {
                  return header;
              }
      
              public void setHeader(String header) {
                  this.header = header;
              }
      
              public String getProperty() {
                  return property;
              }
      
              public void setProperty(String property) {
                  this.property = property;
              }
      
              public SelectItem[] getItems() {
                  return items;
              }
      
              public void setItems(SelectItem[] items) {
                  this.items = items;
              }
          }
      

      在列中设置 selectItems

      if(model.getProperty().equals("country")){
                          model.setItems(countryOptions);
                      }if(model.getProperty().equals("jobType")){
                          model.setItems(jobTypeOptions);
                      }
      

      【讨论】:

        猜你喜欢
        • 2022-12-07
        • 2017-02-11
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2015-04-10
        • 2018-04-02
        • 1970-01-01
        相关资源
        最近更新 更多