#jsf #jsf-2 #primefaces #datatable
#jsf #jsf-2 #первичные данные #datatable
Вопрос:
PF 5.0.2, Mojara 2.1.21
У меня есть DataTable с фильтрами и моим собственным полем автозаполнения для фильтрации данных. Если я хочу обновить DataTable, я использую «PF (‘table’).filter()», потому что «обычное» обновление не работает. Проблема в том, что «PF(‘table’).filter()» повторно инициализировал «filteredValue»-резервный список свойств компонента со значениями filterd от клиента и игнорирует значение в моем собственном текстовом поле автозаполнения
<p:dataTable filteredValue="#{bean.filtered}"
value="#{bean.values}"
widgetVar="table" >
<p:column filterBy="#{bean.number}">
#{bean.number}
</p:column>
...
</p:dataTable>
<p:autoComplete value="#{bean.textFilter}" />
<p:commandButton value="OK" oncomplete="PF('table').filter();" update="" />
<!-- no update :) -->
Так, например, до нажатия кнопки OK
Before:
bean.filtered= { 1}
bean.values = { 1, 2, 3}
и после нажатия кнопки OK он будет изменен на
After:
bean.filtered= { 1, 2, 3 }
bean.values = { 1, 2, 3 }
И я хочу, чтобы все оставалось по-прежнему.
РЕДАКТИРОВАТЬ: я принял ответ, но есть проблемы. Это делает работу. Но primefaces ведет себя как сумасшедший, потому что set-method не выполняет то, что, по мнению PrimeFaces, он должен делать. Итак, я использовал filterEvent в DataTable для достижения того, чего я хочу.
Ответ №1:
Это ожидаемое поведение, потому что вы используете PF('table').filter()
. Однако вы можете добавить Boolean
в свой ManagedBean и обновлять его каждый раз, когда вызывается ваш сеттер фильтрованного списка. Таким образом, вам нужно будет сделать:
<p:commandButton value="OK" oncomplete="PF('table').filter();" update=""
actionListener="#{bean.negateFilter}"/>
В вашем ManagedBean:
...
private Boolean allowFilter;
...
public void negateFilter(){
this.allowFilter = Boolean.FALSE;
}
...
public void setFiltered(List<Object> filtered){
if (!allowFilter)
this.filtered = filtered;
allowFilter = Boolean.TRUE;
}
...
Затем, если allowFilter
равно false, это означает, что вы нажали кнопку автозаполнения, и ваш отфильтрованный список не будет изменен.
Комментарии:
1. Привет, спасибо за ответ. Я попробовал ваше решение, оно выполняет свою работу. Но primefaces ведет себя как сумасшедший, потому что set-method не выполняет то, что, по мнению PrimeFaces, он должен делать. Итак, я использовал filterEvent в DataTable для достижения того, чего я хочу.