2011-07-12 18 views
11

Primefaces DataCable umożliwia skonfigurowanie typu filtrowania używanego dla kolumny, używając właściwości filterMatchMode.Jak działa filterMatchMode z PrimeFaces DataTable?

Niemniej jednak, jeśli używasz LazyDataModel, musisz zaimplementować własną metodę wyszukiwania, która w ogóle nie przyjmuje tej właściwości. czy ta funkcja jest przydatna tylko w przypadku normalnych modeli danych?

+0

GitHub problem: https://github.com/primefaces/primefaces/issues/30 – lazlev

Odpowiedz

12

Obecnie ta funkcja nie jest obsługiwana po uruchomieniu programu LazyDataModel, ale nadal można z niej korzystać przy stosunkowo niewielkim nakładzie pracy. blemasleposted odpowiednia poprawka na forum PrimFaces, niestety nadal nie ma odpowiedzi od twórców.

Jeśli chcesz użyć rozwiązania nieinwazyjnego, możesz wypróbować moje.

ograniczenia filtracyjne są otrzymywane z:

/** 
* @param tableExpr 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 (Column 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; 
} 

Gdzie FilterMatchMode jest:

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); 
} 

} 
+0

Gdzie umieścić ' metoda getFiltersMatchMode'? – senyor

+0

@senyor Użyj go w implementacji metody load 'LazyDataModel'' load() '. – Micer

Powiązane problemy