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

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

ただいまの
回答率

90.48%

  • PrimeFaces

    34questions

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

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

受付中

回答 1

投稿

  • 評価
  • クリップ 0
  • VIEW 1,836

pekoooe

score 2

前提・実現したいこと

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"が怪しそうなので、未定義などもやりましたが状況は変わりませんでした。

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

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

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

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

回答 1

0

pekoooeさん

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

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

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

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2016/11/28 00:06

    kikutaroさん
    ご回答ありがとうございます。

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

    キャンセル

  • 2016/11/28 18:19

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

    キャンセル

  • 2016/11/29 09:33

    kikutaroさん
    コメント、ありがとうございます。

    試行錯誤したところ、いくつか見えてきたところがありますので中間報告します。
    やってみたこと
    (1)lazy="true"をやめた。
    (2)データ取得をgetterで行っていたのをやめて、@PostConstructが実行。
     getterは一覧を返すだけにした。

    これによって、以下のようになりました。
    ・1ページ目のデータソートが可能になった。
    ・事象【その2】 の「ページング用ボタンの2が表示されなくなる。」が解決。

    まだNGな部分。
    ・2ページ目以降に遷移してソート実行すると、ソートが有効にならない。
     これはご指摘のありました@RequestScopedの問題だと思います。

    これから@ViewScopedへの変更を試みます。

    キャンセル

同じタグがついた質問を見る

  • PrimeFaces

    34questions

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