7

私は、OracleのJSF2.2実装の2.2.0-m05マイルストーンビルドでPrimefaces3.4.1を使用しています。また、依存性注入といくつかのAOPにSpring3.1を使用しています。

Primefacesツリーコンポーネントを使用して、論理フィルタールールの複合を表示しようとしています(ユーザーが複合構造内の任意の深さに複合/リーフノードを作成できるようにします)。

複合フィルターの例:

((location ='cal')AND(description contains'test'))OR(project ='someProject')

ツリーマークアップの例:

<p:tree value="#{form.rootComponent}" var="filterComponent" animate="true">

    <p:treeNode type="composite">
       <!-- some composite specific components -->
    </p:treeNode>

    <p:treeNode type="leaf">
       <!-- some leaf specific components -->
    </p:treeNode>

</p:tree>

要素の「value」属性はルートTreeNode(管理対象Beanから取得)を受け入れますが、「var」属性は、ノード自体ではなく、現在のツリーノードに存在する実際のデータを指します。マークアップまたはプログラムで、ラップされたデータではなく、現在のツリーノードにアクセスする方法が必要です

マークアップでアクセスできる場合は、メソッド引数としてマネージドBeanに渡すことができます。マークアップでアクセスする方法がない場合、モデルオブジェクトを介してプログラムで直接アクセスできますか?(おそらく、基礎となるツリーモデルへのアクセスを取得することによって?)

データコレクションの代わりに、基になるDataModelに解決される式を、h:dataTableの「値」として直接使用できることは知っていますが、ルートノード自体はp:treeでのみ使用できると思います。

ラップされたデータオブジェクトにツリーノードへの参照を含めることもできますが、可能であれば、厄介な循環参照は避けたいと思います。

より良い代替手段がない場合は、「binding」属性を使用して、p:tree要素をマネージドBeanのTreeインスタンス(Treeはp:treeのUIComponentクラス)に直接バインドしようとしました。これにより、 getTreeNode()メソッドを介した現在のノードですが、マネージドBeanとビューコンポーネント間のライフサイクルの不一致を考慮して、これを回避したいと思います。それはそのままでは完全には機能しておらず、はるかに優れた、より単純な解決策があるはずだと思います。

また、複合パーツを処理するためにネストされたデータテーブルを使用してjsfデータテーブルを使用しようとしましたが、jsfマークアップ内で条件付き再帰構造を作成するのが難しいため、これに反対しました(「rendered」属性はビューのビルド時に評価されないと思います)したがって、無限再帰を回避することは困難です)。

明確にするために、私は「var」によって参照されるデータを含む現在のツリーノードにのみ関心があり、ユーザーが現在選択しているノードには関心がありません。

4

2 に答える 2

0

さて、ツリーコンポーネントには「選択」という属性があります。マネージド Bean メソッドへの参照を提供するだけで済みます。

たとえば、xhtml で属性を次のように定義します。

selection="#{myManagedBean.selectedNode}"

上記の属性の定義では、org.primefaces.model.TreeNode インスタンスを参照するマネージド Bean で通常のセッター メソッドとゲッター メソッドを提供する必要があります。

于 2013-07-21T08:19:56.267 に答える