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