1

過去数日間、私は自分にとって問題となった課題に直面しています。

私はrich:dataTable独自のフィルタリングと並べ替えの列を使用しています。バックエンドの標準的な並べ替えおよびフィルタリングBeanを使用した単純な入力または選択。私の問題は、多くのフォームの値をこの並べ替えとフィルタリングで復元して、場合によっては復元する必要があることです。たとえば、ユーザーが戻るボタンを使用する場合(最も重要な場合)。ブラウザの戻るボタンの処理方法は知っていますが、簡単で明確な方法で値を保存および復元する必要があるかどうかはわかりません。重要なのは、使用できないこと rich:extandedDataTableと、Beanのビュースコープを使用することです。

(解決策の1つは、セッションスコープBeanを使用してs&fを管理することでしたが、1つのフォームに対して1つのBeanを作成するのは非常にコストがかかり、そのようなBeanを1つ作成することは、私が望む方法で使用するのが非常に複雑です。)

だから、私の質問は:どうすればそれを行うことができますか?そのようなことに対処するためのベストプラクティスは何ですか?どちらの道を行けばいいですか?

私はRF4.3とMojarra2.1.17を使用しています(それほど重要ではないと思います)。

4

1 に答える 1

2

理想的には、stateVar属性はあなたのニーズに理想的ですが、それに関するドキュメントはまばらであり、誰もそれをどうするかを本当に知っているようには見えません。次のハックをお勧めします。基本的には、データテーブル変数の状態を手動で保存および復元します。

テーブルの現在のフィルター状態を単に保持したい場合、RFdatatableにgetComponentState()は基本的にそれを行うメソッドがあります。特定の値を保存する場合は、自分でデータテーブルに飛び込む必要があります。何を選択しても、コンポーネントのライフサイクルのどこかでそれを実行する必要があります

  1. <f:event/>データテーブルの状態変数をキャプチャする適切なリスナーを定義します。私はお勧めしpreValidateます。

     <rich:extendedDataTable binding="#{bean.table}" ...>       
       <f:event type="preValidate" listener="bean.saveTableState"/>        
     </rich:extendedDataTable>
    

    次に、テーブルバインディングから状態変数を取得するメソッドをバッキングBeanで定義します。

     public void saveTableState(ComponentSystemEvent evt){
          UIExtendedDataTable table = (UIExtendedDataTable)evt.getComponent();
          //now you have the table, you can get what you need from it
            DataComponentState savedState = table.getComponentState(); //this object obtained here you can restore to reset the table to it's condition when you obtained the state.
            //or go into the table's hierarchy to retrieve specific values
            Iterator<UIComponent> cols = table.columns();
            while(cols.hasNext()){
            UIColumn col = (UIColumn)cols.next();
              col.getFilterValue(); //Retrieve the current filter value on the column
            }       
     }
    
  2. 好みに応じて、コンポーネントのライフサイクルで適切なポイントを見つけて値を復元します。お勧めしpreRenderComponentます。

        public void restoreTableConditions(ComponentSystemEvent evt){
         table.restoreState(FacesContext.getCurrentInstance(),savedState); //restore the DataComponentState from wherever you stashed it
        }
    
于 2013-02-27T16:50:14.813 に答える