Как не потерять данные фильтрации в таблице.вызов filter() в Primefaces Datatable

#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 для достижения того, чего я хочу.