PrimeFaces中的数据表中的排序不起作用?

时间:2011-02-16 18:47:16

标签: jsf xhtml facelets primefaces

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>

@Sean

查看以下代码

             汽车清单                   

    <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 个答案:

答案 0 :(得分:40)

primefaces支持bean(ViewScoped!)必须拥有它自己的行列表。因此,例如,如果您在每次请求p:dataTable:value时查询数据库,则排序将不起作用。

解决方案:从数据库中收集列表并将其保存在辅助bean中的本地List变量中。

public List<Row> getDataTable() {
    if (tableDataList == null)
        tableDataList = loadListOnce();
    return tableDataList;
}

答案 1 :(得分:10)

问题是:

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

排序由列表中<p:dataTable/>的{​​{1}}完成,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重新加载列表。

使用 PrimeFaces版本3.1.1 Mojarra 2.1.8 进行测试

答案 2 :(得分:5)

如果在getter排序中填充表格将不起作用(如上所述)。 你应该把你的吸气剂放在:

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

然后你可以通过punting tableDataList = null来重置(刷新)你的“现金”;如果你不刷新你的数据表。

答案 3 :(得分:1)

我的服务有:

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表中排序数据的问题。

答案 4 :(得分:0)

当我的支持bean是sessionScoped时,我有一个问题。不确定您的确切问题是什么,但如果您点击排序按钮但没有任何反应,请尝试将范围更改为@ViewScoped。

答案 5 :(得分:0)

你试过@SessionScoped吗?它对我很好,希望这有帮助。

答案 6 :(得分:0)

我不知道你的情况。有一个主要问题。有关数据表的错误。看看这里: https://code.google.com/archive/p/primefaces/issues/2476

有一些解决方法:

  1. 您可以为数据表使用lazyDataModel,它可以正常工作。

  2. 您可以强制排序顺序。

  3. 在您的数据表中捕获排序事件

    <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}" />
    

    在托管bean中,您可以按字符串设置订单以添加到查询中

    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]
    }