2

(1) クリック時にバッキング Bean プロパティを更新し、(2) ap:dialog を表示する必要がある ap:menuitem があります。

これは私が持っているセットアップです:

<p:menuitem value="Show Dialog"
            oncomplete="dialog_widget.show();"
            update=":dialog"
            actionListener="#{bean.setCurrentAction}">
</p:menuitem>

<p:dialog widgetVar="dialog_widget" id="dialog" dynamic="true">
     <h:form>
        <p:inputText value="#{bean.record.text} />
     // the proper rendering of this dialog form depends on bean.currentAction
     // being set during JSF Phase 4 Update Model Values

</p:dialog>

そしてバッキングビーン:

public R getRecord() {
    if (currentAction == null) {
        return null;
    }
    return currentAction == NEW ? newRecord : selectedRecord;
}         

問題は、actionListeners とアクションがフェーズ 5 の間にのみ実行され、その前に bean.currentAction を設定して、ダイアログを適切に更新およびレンダリングできるようにする必要があることです。

** 私が達成しようとしていることの背景: ダイアログ フォームは、新しいレコードの作成と既存のレコードの更新 (ダイアログの追加と編集) に使用されます。したがって、Bean の「currentAction」は、ユーザーが実行しているアクションを示します。どのアクションに応じて、フォームは異なるモデル オブジェクト (「newRecord」または「selectedRecord」) を使用して、フォーム データをプルして保存する必要があります。

4

3 に答える 3

0

あまり洗練されたソリューションではありませんが、PrimeFaces の RequestContext の update メソッドを使用して更新ターゲットを設定し、execute メソッドを使用して、必要なプロパティを設定した後に actionListener にダイアログを表示できます。

于 2013-02-22T15:19:29.310 に答える
0

ダイアログが開く前にバッキング Bean メソッドを呼び出す必要がある場合は、ajax 関数を使用できます (アプリケーションで ajax を使用できるかどうかはわかりません)。p:menuItem にはonclickという関数があり、ここでa4j:ajax関数を呼び出して、バッキング Bean メソッドを呼び出し、ダイアログが開く前にモデルを更新できます。

于 2013-02-22T16:54:17.927 に答える
0

デフォルトでは、アクションは「アプリケーションの呼び出し」フェーズで呼び出されます。immediate="true"タグに属性を追加できますp:menuitem。これにより、「リクエスト値の適用」フェーズでアクションが呼び出されます。

于 2013-02-22T17:33:58.350 に答える