1

最後に、データテーブル構造が外部ソースに従って定義されている場合に、JSFでDOMのようなアプローチを使用して真の動的テーブルを構築する方法を管理しました。(動的な列を持つDataTableは、まさに私が必要としているものです)基本的に、次のコードで十分です。

<p:layoutUnit position="west">
    <!-- 2 -->
    <p:tree value="#{tableViewsPageBean.root}" var="node" dynamic="true" cache="false"
                                        selectionMode="single" selection="#{tableViewsPageBean.selectedNode}">
        <!-- 3 -->
        <p:ajax event="select" listener="#{tableViewsPageBean.onNodeSelect}"/>
        <p:treeNode id="treeNode">
            <h:outputText value="#{node}"/>
        </p:treeNode>
    </p:tree>
</p:layoutUnit>
<p:layoutUnit position="center">
    <h:panelGroup>
        <h:panelGroup rendered="#{tableViewsPageBean.isRegeneratable}">
            <p:commandButton value="#{fu:$(languageBean, 'REGENERATE')}"
                             action="#{dynamicTableViewBean.regenerate}"/>
        </h:panelGroup>
        <!-- 1 -->
        <h:panelGroup binding="#{dynamicTableViewBean.dataTableGroup}"/> 
    </h:panelGroup>
</p:layoutUnit>

しかし、私が現在解決する方法がわからない問題があります。上記のコードを見ると、バッキングBeanメソッドのフローを表すコメントに数値マーカーが表示されています。

  1. binding="#{dynamicTableViewBean.dataTableGroup}"
  2. selection="#{tableViewsPageBean.selectedNode}"
  3. listener="#{tableViewsPageBean.onNodeSelect}"

h:panelGroupユーザーがツリービューで選択を変更した後に、のバインディングを定義する必要があるため、この順序は私には適していません。簡単に言うと、最適なフローは次のとおりです。

  1. selection="#{tableViewsPageBean.selectedNode}"(以前は2)
  2. listener="#{tableViewsPageBean.onNodeSelect}"(以前は3)
  3. binding="#{dynamicTableViewBean.dataTableGroup}"(以前は1)

そのため、ツリーでのユーザーの選択を尊重するデータテーブルコンポーネントを構築できました。それで、それは上記のメソッドを実行する別の順序を強制する方法ですか?使用したPrimeFacesバージョン:3.2

前もって感謝します。あなたの助けは大歓迎です。

4

2 に答える 2

2

JSP 上の古い JSF 1.x ではそのように機能しましたが、Facelets 上の JSF 2.x では機能しなくなりました。ただし、呼び出し順序は重要ではありません。bindinggetter/setter を通常の getter/setter にして、dataTableGroup代わりにリスナー メソッド内を操作するだけです。結局のところ、同じオブジェクト参照です。

public void onNodeSelect(NodeSelectEvent event) {
    dataTableGroup.getChildren().add(...);
    // ...
}

ajax リクエストが完了したときにバインドされた panelgroup またはその親の 1 つを実際に更新するためにupdate属性を追加するだけで済みます。<p:ajax>

例えば

<h:form id="formId">
    ....
    <p:ajax event="select" listener="#{tableViewsPageBean.onNodeSelect}" update=":formId:groupId" />
    ...
    <h:panelGroup id="groupId" binding="#{dynamicTableViewBean.dataTableGroup}"/> 
    ...
</h:form>

ところで、PrimeFaces の<p:columns>コンポーネントをご存知ですか?必要なのが動的列だけである場合は、より良い解決策になる可能性があります。UIComponentこのソリューションは、暗い JSF 1.x 時代には存在しなかったため、扱いにくいbinding回避策が適用されました。

于 2012-05-02T16:20:57.777 に答える
1

バインディング式を後で強制的に実行することはできません。これは JSF ライフサイクルの機能であるためです。つまり、リクエスト処理の最初の段階 (フェーズ「ビューの復元」中) にバインディングを設定します。
また、アクション リスナーからモデルベースのツリー更新をトリガーすることもお勧めします (つまり、#{tableViewsPageBean.onNodeSelect}および/または#{dynamicTableViewBean.regenerate})。これは、「アプリケーションの呼び出し」フェーズで実行されるためです (送信された値が変換され、検証され、モデル オブジェクトに適用された後)。 「レスポンスのレンダリング」の前。
バインディング式から取得した PanelGroup の参照を引き続き使用し、Java コードでその子を操作できます。

于 2012-05-03T14:20:26.767 に答える