web-dev-qa-db-ja.com

PrimeFacesのdatatableで並べ替えが機能していませんか?

PrimeFacesのdatatableで並べ替えが機能していません。提案してください。

以下の私の.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>

上記のコードではソートが機能していません

助けてください

15
user617966

PrimefacesバッキングBean(ViewScoped!)は、独自の行リストを保持する必要があります。したがって、たとえば、p:dataTable:valueを要求するたびにデータベースにクエリを実行すると、並べ替えは機能しません。

解決策:データベースからリストを収集し、バッキングBeanのローカルリスト変数に保持します。

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

問題は:

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

これにより、<p:dataTable/>によって並べ替えが行われる前に、PhaseId.RESTORE_VIEWでリストが再読み込みされます。

PrimeFacesバージョン3.1.1およびMojarra 2.1.8でテスト済み

10
Sascha Groß

ゲッターでテーブルにデータを入力すると、並べ替えは機能しません(上記のとおり)。あなたは次のようにあなたのゲッターを入れるべきです:

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

次に、tableDataList = null;をパントすることにより、「現金」をリセット(更新)できます。データテーブルを更新しない場合。

5
bkomac

私のサービスは:

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

しかし、それは間違っていました。なぜなら、テーブルからgetAllPlayers()を呼び出していたからです。

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

DAOから取得したデータを更新しましたが、まだ順序付けされていません。その代わりに、リストを更新するためのリストフィールドとメソッドを作成しました

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テーブルのデータの並べ替えに関する問題が解決しました。

1

バッキングBeanがsessionScopedのときに、ソートで問題が発生しました。正確な問題が何であるかはわかりませんが、並べ替えボタンを押しても何も起こらない場合は、スコープを@ViewScopedに変更してみてください。

0
Sean

それがあなたの場合かどうかはわかりません。 Primefacesの問題があります。ある種のデータテーブルのバグ。こちらをご覧ください: https://code.google.com/archive/p/primefaces/issues/2476

いくつかの回避策があります:

  1. データテーブルにlazyDataModelを使用でき、機能します。

  2. 並べ替え順序を強制できます。

データテーブルでsortイベントをキャッチします

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

@SessionScopedを試しましたか?それは私にはうまくいきます、この助けを願っています。

0
Mythox