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>
上記のコードではソートが機能していません
助けてください
PrimefacesバッキングBean(ViewScoped!)は、独自の行リストを保持する必要があります。したがって、たとえば、p:dataTable:value
を要求するたびにデータベースにクエリを実行すると、並べ替えは機能しません。
解決策:データベースからリストを収集し、バッキングBeanのローカルリスト変数に保持します。
public List<Row> getDataTable() {
if (tableDataList == null)
tableDataList = loadListOnce();
return tableDataList;
}
問題は:
<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でテスト済み
ゲッターでテーブルにデータを入力すると、並べ替えは機能しません(上記のとおり)。あなたは次のようにあなたのゲッターを入れるべきです:
public List<Row> getTableData() {
if (tableDataList == null)
tableDataList = dao.getTableData();
return tableDataList;
}
次に、tableDataList = null;をパントすることにより、「現金」をリセット(更新)できます。データテーブルを更新しない場合。
私のサービスは:
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テーブルのデータの並べ替えに関する問題が解決しました。
バッキングBeanがsessionScopedのときに、ソートで問題が発生しました。正確な問題が何であるかはわかりませんが、並べ替えボタンを押しても何も起こらない場合は、スコープを@ViewScopedに変更してみてください。
それがあなたの場合かどうかはわかりません。 Primefacesの問題があります。ある種のデータテーブルのバグ。こちらをご覧ください: https://code.google.com/archive/p/primefaces/issues/2476
いくつかの回避策があります:
データテーブルにlazyDataModelを使用でき、機能します。
並べ替え順序を強制できます。
データテーブルで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]
}
@SessionScopedを試しましたか?それは私にはうまくいきます、この助けを願っています。