Сортировка не работает в DataFat в PrimeFaces? - PullRequest
15 голосов
/ 16 февраля 2011

Сортировка не работает в DataFats в PrimeFaces.Пожалуйста, предложите.

Смотрите ниже мой .xhtml файл

<h:form>

  <p:dataTable style="width: 60%" id="dt1" value="#{bean.list}" var="entry" first="0" paginator="true" rows="10" paginatorTemplate="{CurrentPageReport}  {FirstPageLink} {PreviousPageLink} {PageLinks} {NextPageLink} {LastPageLink} {RowsPerPageDropdown}" rowsPerPageTemplate="5,10,15" emptyMessage="No cars found with given criteria" >

    <f:facet name="header">
      <h2>Cars View</h2>
    </f:facet>

    <p:column sortBy="#{entry.carno}" filterBy="#{entry.carno}">
      <f:facet name="header">
        <h:outputText value="Car Number" />
      </f:facet>
      <h:outputText value="#{entry.carno}"></h:outputText>
    </p:column>

    <p:column sortBy="#{entry.carsettings['car-model']}" filterBy="#{entry.carsettings['car-model']}">
      <f:facet name="header">
        <h:outputText value="Car Model"/>
      </f:facet>
      <h:outputText value="#{entry.carsettings['car-model']}"></h:outputText>
    </p:column>

    <p:column sortBy="#{entry.carsettings.year}" filterBy="#{entry.carsettings.year}">
      <f:facet name="header">
        <h:outputText value="Car Year"/>
      </f:facet>
      <h:outputText value="#{entry.carsettings.year}"></h:outputText>
    </p:column>

    <p:column sortBy="#{entry.carsettings.color}" filterBy="#{entry.carsettings.color}">
      <f:facet name="header">
        <h:outputText value="Car Color"/>
      </f:facet>
      <h:outputText value="#{entry.carsettings.color}"></h:outputText>
    </p:column>
  </p:dataTable>
</h:form>

@ Шон

Смотрите ниже код

Список автомобилей

    <ui:composition template="/template.xhtml">
        <ui:define name="content">
            <f:view>
                <f:event type="preRenderView" listener="#{MyBackingBean.load}"></f:event>
                <center>
                    <h1>Car View</h1>
                    <h:outputText value="No data found" style="font-size: 15px;font-family: Arial, Verdana,Helvetica, sans-serif" rendered="#{MyBackingBean.noDataExist}"></h:outputText>
                    <h:form id="dataform1">
                        <p:dataTable var="item" value="#{MyBackingBean.dataList}" dynamic="true" paginator="true" rows="2" id="table"  style="width:60%"
                                     rendered="#{!MyBackingBean.noDataExist}" >
                            <p:column sortBy="#{item.id}" filterBy="#{item.id}">
                                <f:facet name="header">
                                    <h:outputText value="ID" />
                                </f:facet>
                                <h:outputText value="#{item.id}" />
                            </p:column>
                            <p:column sortBy="#{item.carsettings['car-color']}" filterBy="#{item.carsettings['car-color']}">
                                <f:facet name="header">
                                    <h:outputText value="Color" />
                                </f:facet>
                                <h:outputLink target="_blank" value="http://#{item.carsettings['car-color']}">
                                    <h:outputText value="#{item.carsettings['car-color']}" />
                                </h:outputLink>
                            </p:column>
                            <p:column sortBy="#{item.carsettings.model}" filterBy="#{item.carsettings.model}">
                                <f:facet name="header">
                                    <h:outputText value="Model" />
                                </f:facet>
                                <h:outputText value="#{item.carsettings.model}" />
                            </p:column>
                            <p:column sortBy="#{item.carsettings.manufacturer}" filterBy="#{item.carsettings.manufacturer}">
                                <f:facet name="header">
                                    <h:outputText value="Manufacturer" />
                                </f:facet>
                                <h:outputText value="#{item.carsettings.manufacturer}" />
                            </p:column>
                        </p:dataTable>
                    </h:form>
                </center>
            </f:view>
        </ui:define>
    </ui:composition>
</h:body>

Сортировка не работает в приведенном выше коде

Пожалуйста, помогите

Ответы [ 7 ]

40 голосов
/ 04 апреля 2011

Основной компонент (ViewScoped!) Должен содержать свой собственный список строк. Так, например, если вы запрашиваете базу данных каждый раз, когда запрашиваете p:dataTable:value, сортировка не будет работать.

Решение: собрать список из базы данных и сохранить его в локальной переменной List в компоненте поддержки.

public List<Row> getDataTable() {
    if (tableDataList == null)
        tableDataList = loadListOnce();
    return tableDataList;
}
10 голосов
/ 25 июня 2012

Проблема заключается в следующем:

<f:event type="preRenderView" listener="#{MyBackingBean.load}"></f:event>

Сортировка выполняется <p:dataTable/> в PhaseId.APPLY_REQUEST_VALUES в списке, с <f:event type"preRenderView"/> вы перезагружаете список в PhaseId.RENDER_RESPONSE, и поэтому вы потерялисортировка.

Решение: используйте <f:event type="postAddToView"/>

<f:event type="postAddToView" listener="#{MyBackingBean.load}" />

Это перезагрузит список в PhaseId.RESTORE_VIEW, прежде чем сортировка будет выполнена <p:dataTable/>.

Протестировано с PrimeFaces Версия 3.1.1 и Мохарра 2.1.8

5 голосов
/ 07 апреля 2013

Если вы заполняете свою таблицу в геттере, сортировка не будет работать (как описано выше). Вы должны вставить в свой геттер, как:

public List<Row> getTableData() {
    if (tableDataList == null)
        tableDataList = dao.getTableData();
    return tableDataList;
}

Затем вы можете сбросить (обновить) ваши «наличные», нажав tableDataList = null; если вы не обновите свою базу данных.

1 голос
/ 06 января 2014

Мой сервис имел:

public List<PlayerEntity> getAllPlayers() {
    return playerDao.readAll();
}

но это было неправильно, потому что когда я вызывал getAllPlayers () из таблицы

<p:dataTable id="data" value="#{myBean.allPlayers}"/>

Я получил от DAO обновленные данные, но все еще неупорядоченный. Вместо этого я создал поле List и метод для обновления List

private List<PlayerEntity> allPlayers = new ArrayList<PlayerEntity>();  

public void updateAllPlayers(){
    this.allPlayers = playerDao.readAll();
}

какой метод я запускаю при инициализации bean

public void setPlayerDao(PlayerDao playerDao) {
    this.playerDao = playerDao;
    updateAllPlayers();
}

и после добавления, удаления или изменения списка

public boolean createPlayer(PlayerEntity playerEntity) {
    (...)
    updateAllPlayers();
    return true;
}

Теперь мой сервис имеет

public List<PlayerEntity> getAllPlayers() {
    return this.allPlayers;
}

и это решило мою проблему с сортировкой данных в таблице Primefaces.

0 голосов
/ 16 июля 2016

Я не знаю, если это ваш случай.Есть проблема с первыми лицами.Ошибка в виде данных.Посмотрите здесь: https://code.google.com/archive/p/primefaces/issues/2476

Есть несколько обходных путей:

  1. вы можете использовать lazyDataModel для вашей таблицы данных, это работает.1010 *

    Вы можете форсировать порядок сортировки.

В вашей таблице данных событие сортировки

<p:dataTable style="width: 60%" id="dt1" value="#{bean.list}" var="entry" first="0" paginator="true" rows="10" paginatorTemplate="{CurrentPageReport}  {FirstPageLink} {PreviousPageLink} {PageLinks} {NextPageLink} {LastPageLink} {RowsPerPageDropdown}" rowsPerPageTemplate="5,10,15" emptyMessage="No cars found with given criteria" >
<p:ajax event="sort" listener="#bean.sortListener}" />

В вашем управляемом бине вы устанавливаете порядок по строке для добавления к вашему запросу

private String orderBy = "";

public void sortListener(SortEvent event) {
    String orderColumn = event.getSortColumn().getValueExpression("sortBy").getExpressionString();

    //you will get the content of the attribute SortBy of the column you clicked on, like #{entry.carno}
    orderColumn = orderColumn.replace("#{entry.", "");
    orderColumn = orderColumn.replace("}", "");
    orderBy = " order by " + orderColumn + (event.isAscending()? " asc " : " desc ");
}

public List<Car> getList(){
    String query = "[...your query...]" + orderBy;
    ...[execute your query and get your ordered list]
}
0 голосов
/ 22 апреля 2011

вы пробовали @SessionScoped?это прекрасно работает для меня, надеюсь, это поможет.

0 голосов
/ 17 февраля 2011

У меня была проблема с сортировкой, когда мой компонент поддержки был сессионным.Не уверен, в чем именно заключается ваша проблема, но если вы нажмете кнопку сортировки и ничего не произойдет, попробуйте изменить область действия на @ViewScoped.

...