2012-01-13 6 views
1

私たちは、シームフェイスとCDIを備えたアプリケーションでPrimefaces 3.0.RC2を使用しています。私たちは、コンポーネントのショーケース上の遅延ロードされたデータテーブルの実装に従ってきました。大きなデータセットがあるため、load()メソッドをオーバーライドしてpagewise結果のみを取得しました。 (一度にすべてのレコードをメモリにロードする)。Primefaces - カスタムページネーション/ソートload()issue

ページ分割は期待通りに機能しますが、ソートは機能しません。レコードは、列見出しがクリックされたときに正しくソートされます。以降のすべてのクリックでは、load()メソッドが2回呼び出され、並べ替え順に異なる値が送信されます。その結果、並べ替え順は同じままになります。両方のload()呼び出しがAPPLY_REQUEST_VALUESフェーズで行われているようです。

なぜこのようなことが起こり、どのように避けられるのかについては、誰でも入力することができます。どのポインタも高く評価されます。

追加情報: 前述のように、load()メソッドをオーバーライドして、結果をページワイズにフェッチするようにDBにクエリを実行します(クエリで最大結果と順序を指定します)。

@Override 
public List<ABC> load(int first, int pageSize, String sortField, SortOrder 
sortOrder, Map<String, String> filters) 
{ 
    // Fetch data pagewise from the database 
    datasource = dao.findPagewiseSortedResults(sortField, 
      SortOrder.ASCENDING == sortOrder ? true : false, first, pageSize); 

    // Set the row count 
    this.setRowCount((int) dao.findTotalCount()); 

    return datasource; 
} 

ただし、並べ替えのためにデータモデルの列をクリックすると、2つの投稿要求が行われます。

XHTMLコードの下に検索:

 <p:dataTable id="dataTable" var="record" 
     value="#{testBean.lazyModel}" paginator="true" rows="5" 
     paginatorTemplate="{FirstPageLink} {PreviousPageLink} {CurrentPageReport}   {NextPageLink} {LastPageLink}" 
     selectionMode="single" selection="#{testBean.selectedRecord}" 
     sortBy="#{record.username}"> 

     <p:ajax event="rowSelect" listener="#{testBean.onRowSelect}" 
      update=":form:display" oncomplete="accountDialog.show()" /> 

     <p:ajax event="colResize" update=":form:growl" 
      listener="#{testBean.onResize}" /> 

     <p:column sortBy="#{record.username}" 
      filterBy="#{record.username}"> 
      <f:facet name="header"> 
       <h:outputText value="User Name" /> 
      </f:facet> 
      <h:outputText value="#{record.username}" /> 
     </p:column>......... 

     </dataTable> 

私たちも最新Primefacesバージョン(3.0.1)にアップグレードしたが、それは助けていません。何かが欠けていますか?どんなポインタも非常に役に立ちます。

ありがとうございました。

+0

私は3.0を使用します。 gと並べ替えることができますが、この動作を見ることはできません。そのようなバグがあったとしても(しかしそうではありません)、あなたはいつもsortOrderフィールドを読んで結果として動作することができます。あなたがいくつかのコード – perissf

+0

@ perissfを投稿した方がいいかもしれません、返信いただきありがとうございます。元の質問にいくつかのコードを追加しました。あなたに情報が必要な場合はお知らせください/ – gkari

答えて

0

load()メソッドを使用してソートを行うので、dataTableのネイティブソートツールを使用する必要はありません。 p:dataTableタグからsortBy属性を削除する必要があります。コンポーネントは、このように定義する必要があります

<p:dataTable id="dataTable" var="record" 
    value="#{testBean.lazyModel}" paginator="true" rows="5" 
    paginatorTemplate="{FirstPageLink} {PreviousPageLink} {CurrentPageReport}   {NextPageLink} {LastPageLink}" 
    selectionMode="single" selection="#{testBean.selectedRecord}" > 

EDIT

この方法で、あなたは正確にクライアントによって指定された順序であなたの列がソート可能な必要があります:あなたが読んでますあなたが投稿したJavaコードでSortOrderを指定すると、結果的にあなたのdaoの実装でそのSortOrderを使用します#findPagewiseSortedResults()

+0

もう一度perissfありがとうございます。しかし、これは、私のデータベースクエリで指定した順番でレコードが常にソートされるというわけではありません。どのように私はasc/desc順序でそれらをソートするオプションをユーザーに提供します。私は列をソート可能に保つことを意味し、指定されたソート順に応じて、クエリのorder by節が適用されます。それを行う方法はありますか? – gkari

+0

私は自分の答えを更新しました。あなたが何を求めているのか分からない – perissf

+0

私はあなたも列からsortBy属性を削除するように頼んだと思った。混乱をおかけして申し訳ありません。私はdatatableからsortBy属性を削除しました。結果は昇順にDBから正しくソート&フェッチされます。ただし、並べ替え順序を逆にする列をクリックすると、順序が正しく1回反転された後、何回クリックしても、常に降順でソートされたままになります。私はascend sortorderをバックエンド(最初のload()呼び出し)に送りますが、それに続いてdescの並べ替え順序(2番目のload()呼び出し)が直ちにオーバーライドされ、並べ替えが行われなかったようです。すべてのリード? – gkari