PrimeFaces DataTable 中的 filterMatchMode 是如何工作的?

Posted

技术标签:

【中文标题】PrimeFaces DataTable 中的 filterMatchMode 是如何工作的?【英文标题】:How it works the filterMatchMode from PrimeFaces DataTable? 【发布时间】:2011-10-03 23:02:08 【问题描述】:

Primefaces Datatable 允许您使用属性 filterMatchMode 配置用于列的过滤类型。

不过,如果您使用 LazyDataModel,您必须实现自己的搜索方法,该方法根本不会接收该属性。此功能是否仅对普通 DataModel 有用?

【问题讨论】:

GitHub 问题:github.com/primefaces/primefaces/issues/30 【参考方案1】:

目前,开箱即用的 LazyDataModel 不支持此功能,但您仍然可以轻松使用它。 blemasle postedprimefaces 论坛对应补丁,可惜开发者仍未回复。

如果你想使用非代码侵入的解决方案,你可以试试我的。

过滤器约束通过以下方式获得:

 /**
 * @param tableSearchExpr expression, starting from the view root,
 *        which identifies the datatable to retrieve information from
 * @return map, containing pairs of @code <filtered field id, match mode>.
 *         Filtered field id is evaluated from the 'filterBy' 
 *         attribute of the column in the following way:
 *         #item.name -> name
 *         #item.category.name -> category.name
 */
public Map<String, FilterMatchMode> getFiltersMatchMode(String tableSearchExpr) 
    FacesContext context = FacesContext.getCurrentInstance();
    Object component = context.getViewRoot().findComponent(tableSearchExpr);

    if (null == component) 
        throw new IllegalArgumentException(
                    "No component found for search expression: " 
                            + tableSearchExpr);
    
    if (!(component instanceof DataTable)) 
        throw new IllegalArgumentException(
                    "Component is not a DataTable: " + tableSearchExpr);
    

    DataTable table = (DataTable) component;
    Map<String, FilterMatchMode> constraints = 
            new HashMap<String, FilterMatchMode>(table.getColumns().size());

    for (UIColumn column : table.getColumns()) 
        ValueExpression filterExpression = 
                  column.getValueExpression("filterBy");
        if (null != filterExpression) 
            String filterExpressionString = filterExpression.
                                                   getExpressionString();
            //evaluating filtered field id
            String filteredField = filterExpressionString.substring(
                    filterExpressionString.indexOf('.') + 1,
                    filterExpressionString.indexOf(''));

            FilterMatchMode matchMode = 
                  FilterMatchMode.fromUiParam(column.getFilterMatchMode());

            constraints.put(filteredField, matchMode);
        
    

    return constraints;

FilterMatchMode 在哪里:

public enum FilterMatchMode 

STARTS_WITH("startsWith"), ENDS_WITH("endsWith"), 
CONTAINS("contains"), EXACT("exact");

/**
 * Value of p:column's filterMatchMode attribute 
 *     which corresponds to this math mode
 */
private final String uiParam;

FilterMatchMode(String uiParam) 
    this.uiParam = uiParam;


/**
 * @param uiParam value of p:column's filterMatchMode attribute
 * @return MatchMode which corresponds to given UI parameter
 * @throws IllegalArgumentException if no MatchMode 
 *          is corresponding to given UI parameter
 */
public static FilterMatchMode fromUiParam(String uiParam) 
    for (FilterMatchMode matchMode : values()) 
        if (matchMode.uiParam.equals(uiParam)) 
            return matchMode;
        
    
    throw new IllegalArgumentException("No MatchMode found for " + uiParam);



【讨论】:

你把getFiltersMatchMode方法放在哪里了? @senyor 在你的 LazyDataModel load() 方法实现中使用它。

以上是关于PrimeFaces DataTable 中的 filterMatchMode 是如何工作的?的主要内容,如果未能解决你的问题,请参考以下文章

为 Datatable primefaces 设置列宽

PrimeFaces DataTable 中的 filterMatchMode 是如何工作的?

Primefaces dataTable过滤日期

将 primefaces 数据表与 org.primefaces.component.datatable.DataTable 绑定;

如何根据条件使primefaces datatable列可编辑

使用带有Primefaces DynaForms的dataTable