2015-05-18 2 views
0

Мне нужно сохранять отфильтрованные данные, когда я перемещаюсь между страницами. После ввода данных в ячейку фильтра таблицы данных отображаются правильные отфильтрованные строки. Если последние введенные данные в ячейке фильтра не совпадают с отображаемыми строками данных, и когда я перехожу на другую страницу и возвращаю назад - заголовки столбцов и ячейки фильтра не отображаются. Отображается только paginator. Он отлично работает, если последние введенные данные в ячейке фильтра соответствуют некоторым строкам данных. Он работает правильно, если я не покину страницу с таблицей данных.p: dataTable не отображает заголовок после фильтрации и подкачки назад

код JSF:

<p:dataTable id="tableId" var="intance" widgetVar="instance" 
     value="#{model.rows}" filteredValue="#{model.filteredRows}" 
     sortBy="#{model.sortBy}" sortMode="multiple" rows="5" 
     rowsPerPageTemplate="5, 15" paginator="true" paginatorPosition="bottom"> 
    <p:ajax event="filter" listener="#{model.onFilter}"/> 
    <p:ajax event="sort" listener="#{model.onSort}"/> 
    <p:columns id="columnId" value="#{instance.columnsData}" 
     var="instanceColumn" columnIndexVar="ind" rendered="true" 
     sortBy="#{instance.columnsData[ind]}" 
     filterBy="#{instance.columnsData[ind]}" filterMatchMode="contains" 
     filterValue="#{model.tableFilters[''.concat(ind)]}" 
     headerText="#{labels[ind]}"> 
      <h:outputText value="#{instance.columnsData[ind]}"/> 
    </p:columns> 
</p:dataTable> 

код Java:

public class Model { 

    private List<MyRow> filteredRows; 

    private List<MyRow> rows; 

    private Map<String, String> tableFilters; 

    public void onFilter(FilterEvent event) { 
     tableFilters = event.getFilters(); 
     if (MapUtils.isEmpty(tableFilters)) { 
      filteredRows = null; 
     } 
    } 

    public void List<MyRow> getRows() { 
     //retreve data from service and transform to List<MyRow>) 
     return rows; 
    } 

    /* getters and setter */ 
} 


public class MyRow { 
    private List<Object> columnsData; 
    /* getters and setters */ 
} 

Любые мысли? Код выглядит хорошо для меня и должен работать. Я использую первичности 3.5.

Благодаря

+2

[Не делайте бизнес-логику в метод получения] (http://stackoverflow.com/questions/2090033/why-jsf-calls -getters и множество раз). – BalusC

+0

Спасибо. Вопрос по-прежнему открыт. – bonch

ответ

1

Корень проблемы value="#{instance.columnsData}" из p:columns. В этом случае ошибка #{instance} - ошибка p:dataTable.

Он работает нормально, когда страница загружается в первый раз и когда #{model.rows} не является empty.

Когда #{model.rows} не empty и когда мы вводим значение в ячейке фильтра, который не соответствует данным в #{model.rows}, не отображается ни одной строки, но заголовки столбцов и фильтрующие элементы визуализируются в любом случае из-за частичного рендеринга только данные, содержимое (заголовки таблицы и ячейки фильтра были отображены во время рендеринга страницы).

Когда мы переходим к другой странице, а затем возвращаемся на страницу с нашими отфильтрованными строками в таблице данных, появляется новый полный рендеринг страницы. Таким образом, в этом случае (#{model.filteredRows} не null) не имеет значения, сколько данных #{model.rows}. #{model.filteredRows} будет использоваться для отображения содержимого таблицы данных. Поэтому, когда прайслисты отображают таблицу данных, в моем случае нет данных для рендеринга вообще из-за #{model.filteredRows} является empty не null.

Поскольку я использую #{instance} переменные p:dataTable в p:columns, p:columns не будет оказывать не столбцы - никакие заголовков столбцов и фильтрующие элементы для отображения.

separate field для размещения информации о колонках.

//edited class Model 
public class Model { 
    //add a field that contains columns count. For example: 
    private List<Integer> columns = Collections.nCopies(5, 1); 

    //another fields 
} 

нужно использовать value="#{model.columns}" вместо value="#{instance.columnsData}"

<p:columns id="columnId" value="#{model.columns}" 
    var="instanceColumn" columnIndexVar="ind" rendered="true" 
    sortBy="#{instance.columnsData[ind]}" 
    filterBy="#{instance.columnsData[ind]}" filterMatchMode="contains" 
    filterValue="#{model.tableFilters[''.concat(ind)]}" 
    headerText="#{labels[ind]}"> 
    <h:outputText value="#{instance.columnsData[ind]}"/> 
</p:columns>