2014-01-07 5 views
1

У меня есть фасонный элемент, и у меня есть столбец с фильтром. Я хотел бы применить фильтр к столбцу из бэкэнда.Filter Datatable from Backing Bean jsf-primefaces

Я следил за этим example, и я могу получить входные данные в текстовое поле фильтра в свой bean-компонент.

, но когда я использую setFilter, значения устанавливаются в HashMap, но фильтр не применяется к datatable.

Пример колонки

<p:column filterBy="#{var.value}" headerText="Example" footerText="contains" filterMatchMode="contains" /> 

Бин сеанса и область действия следующий код в функции, которая вызывается на кнопку мыши.

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

это устанавливает значения, но нет никаких изменений в качестве данных.

Я попробовал this, но это не помогло.

Все, что мне нужно - это установить фильтр в столбце данных при нажатии кнопки. Заранее спасибо

+0

Посмотрите на [этой реализации] (http://www.bradchen.com/blog/2012/05/persist-primefaces-datatable-state-across-refresh). Реализация 'setFilterParams' выглядит интересной. Я просто не могу проверить это прямо сейчас – kolossus

ответ

1

Значения в входах DataTable фильтра посылается в запросе карте параметра FacesContext, и полученный DataTableRenderer, когда она оказывающая DataTable (см метода encodeFilter для PF 3.5, PF 4.0 или PF 6.1)

Таким образом, если ваша кнопка находится в той же форме DataTable, значения фильтра отправляются на карте параметров запроса, и рендерер покажет эти значения над тем, что вы хотите.

Вам нужна кнопка, чтобы быть в отдельной форме:

<h:form> 
    <p:commandButton action="#{someBean.action()}" update="@([id$=dataTable])" /> 
</h:form> 
<h:form> 
    <p:dataTable id="dataTable" [...] > 
     <p:column filterBy="#{var.col}" filterValue="#{someBean.filterValue}"> 
      <h:outputText value="#{var.col}"> 
     </p:column> 
    </p:dataTable> 
</h:form> 

И потом, вы можете изменить filterValue в бобе:

@Named 
@SessionScoped 
public SomeBean implements Serializable { 
    private String filterValue; 
    [...] 

    public void action() { 
     filterValue = "new value"; 
    } 

    [getters/setters] 
} 

Вы можете использовать карту для filterValues, если вы используете много фильтров.


В качестве альтернативы, если вам нужно перенаправить пользователя на новую страницу, вы можете поместить значения в URL, вместо того, чтобы использовать filterValue. Пример:

https://example.com/app/pageOfTheTable.xhtml?form:dataTable:colum:filter=new%20value

Часть form:dataTable:colum:filter это идентификатор входного фильтра. Вы можете получить это, проверив элемент, используя ваш браузер. Принцип тот же: вы используете карту параметров запроса.


Возможно, полезно обновить значение бэк-компонента, когда пользователь что-то наберет. Я нашел patch here.

В основном это изменяет метод populateFilterParameterMap, в классе FilterFeature, поэтому он устанавливает значение filterValue. Вы можете добавить дополнительные строки в конец цикла for.

for (...){ 
    [...] 

+ ValueExpression filterValueVE = column.getValueExpression("filterValue"); 
+ if (filterValueVE == null) { 
+  ((UIComponent)column).getAttributes().put("filterValue", filterValue); 
+ } else { 
+  filterValueVE.setValue(context.getELContext(), filterValue); 
+ } 
} 
Смежные вопросы