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 是如何工作的?的主要内容,如果未能解决你的问题,请参考以下文章
PrimeFaces DataTable 中的 filterMatchMode 是如何工作的?
将 primefaces 数据表与 org.primefaces.component.datatable.DataTable 绑定;