質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.37%
PrimeFaces

PrimeFacesは、トルコのソフトウェア会社Prime Teknolojiが提供する、 JSFリッチユーザーインターフェースコンポーネントです。 Apache License V2ライセンスのオープンソースソフトウェアです。

Q&A

1回答

6143閲覧

PrimeFaces dataTableのページングとsortByの組み合わせについて

pekoooe

総合スコア8

PrimeFaces

PrimeFacesは、トルコのソフトウェア会社Prime Teknolojiが提供する、 JSFリッチユーザーインターフェースコンポーネントです。 Apache License V2ライセンスのオープンソースソフトウェアです。

0グッド

0クリップ

投稿2016/11/21 08:12

###前提・実現したいこと
JavaEE7 PrimeFaces5.3 を使用して開発しています。
PrimeFacesのdataTableで検索結果を一覧表示しようとしているのですが、
期待している動作になりません。
参考にしているのはPrimeFaces showcaseのDatatable-Sortです。

ソートマークが表示されたラベルをクリックすると、@PostConstruct定義したメソッドやp:dataTableのvalueで定義した変数のgetterが呼ばれることに起因していると思われます。

sortBy定義時にこれからのメソッドが呼ばれないようにする方法、もしくは呼出し先メソッドでsortByとして呼ばれたことを判別する方法をご存知の方がいらっしゃれば、その方法をご教授ください。

###発生している問題・エラーメッセージ
テストデータを10件準備し、2ページにまたがる環境を作成。
【その1】
ソートマークが表示されたラベルをクリックすると、当初ページング用ボタンとして1、2と表示されていたものが1のみになってしまう。
【その2】
2ページ目に遷移しておいて、ソートラベルをクリックすると1ページ目に遷移してしまう。ページング用ボタンの2が表示されなくなる。

###該当のソースコード
<p:dataTable var="car" value="#{dtSortView.cars1}" style="margin-bottom:40px" paginator="true" rows="5" scrollable="false" lazy="true">
<f:facet name="header">
Single Column Sort
</f:facet>
<p:column headerText="Id" sortBy="#{car.id}">
<h:outputText value="#{car.id}" />
</p:column>

###試したこと
lazy="true"が怪しそうなので、未定義などもやりましたが状況は変わりませんでした。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答1

0

pekoooeさん

私のブログにも同じご質問いただいていたかと思います。ブログコメントで回答させていただいていたのですが、こちらにも回答を書かせていただきます。

dtSortViewクラスのスコープなどがわからないのですが、2ページ目でソートクリックすると1ページ目になってしまうとのことで、RequestScopedになっている等はないでしょうか。

一応自分でもPrimeFaces5.3を使って、ソートとページングを定義して、同じようなビュー定義してみたのですが、問題なく動作しました。以下のGitHubリポジトリに私が確認したコードを置いたので、一度見比べていただけますでしょうか。
https://github.com/kikutaro/AskedPrimeFacesDataTable

投稿2016/11/26 09:12

kikutaro

総合スコア37

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

pekoooe

2016/11/27 15:06

kikutaroさん ご回答ありがとうございます。 ご指摘の通り、RequestScopedを設定しています。内部的に@injectで画面間にわたるデータを引き渡しているためです。 ViewScopedを使うとなると、@injectが使えなくなり全体への影響も大きくなりそうです。まずは@injectを別の方法で置き換えることを考えてみます。
kikutaro

2016/11/28 09:19

ViewScopedでも@Injectは使えると思うのですが、まずはスコープを変えて上記が正常動作になるか等も確認いただければと思います。PrimeFaces(というかJSFかもですが)は、ViewScopedやSessionScopedなど、サーバサイドでのデータ保持を意識してるコンポーネント群も結構あるので、その辺りご注意ください。特にDataTable周りなどは注意が必要です。
pekoooe

2016/11/29 00:33

kikutaroさん コメント、ありがとうございます。 試行錯誤したところ、いくつか見えてきたところがありますので中間報告します。 やってみたこと (1)lazy="true"をやめた。 (2)データ取得をgetterで行っていたのをやめて、@PostConstructが実行。  getterは一覧を返すだけにした。 これによって、以下のようになりました。 ・1ページ目のデータソートが可能になった。 ・事象【その2】 の「ページング用ボタンの2が表示されなくなる。」が解決。 まだNGな部分。 ・2ページ目以降に遷移してソート実行すると、ソートが有効にならない。  これはご指摘のありました@RequestScopedの問題だと思います。 これから@ViewScopedへの変更を試みます。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだベストアンサーが選ばれていません

会員登録して回答してみよう

アカウントをお持ちの方は

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.37%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問