3

エントリを含む Datatable を表示する xhtml ページがあります。新しいエントリを挿入するためのボタンもあり、フォームのあるダイアログが表示されます。挿入フォームは<ui:include>、親の .xhtml と同様に次のように使用されます。

親ファイル

    <h:form id="mainForm">
        <p:commandButton process="@form" update=":dlgGrp" oncomplete="dlg.show()"/>

        <p:datatable id = "datatable"> 

            various columns
            .....
            .....
        </p:datatable>

    </h:form>

    <p:dialog widgetVar="dlg" >

        <h:panelGroup id="dlgGrp">
            <ui:include src="include.xhtml" />
        </h:panelGroup>
    </p:dialog>

</ui:composition>

ダイアログファイル

<ui:composition xmlns . . .>

    <h:form id="subForm">

        various input fields
        ......  
        ......
        <p:commandButton process="@form" update=":mainForm" oncomplete="dlg.hide()"/>

    </h:form>

</ui:composition>

ファイルに示されているように、親コンポーネントを一般的に参照するにはどうすればよいですか。ダイアログで送信ボタンを押すとすぐに、メインフォームを更新してダイアログを非表示にしたいと思います。ただし、これらのコンポーネントは「親フィールド」にあります。

親固有のアクションを子の .xhtml に含めたくないので、これはおそらくバッキング Bean を介してプログラムで行う必要があります。

4

1 に答える 1

2

mainFormのメソッドを介してを更新する場合は、 backingBean. 修正するだけ

<p:commandButton process="@form" action="#{backingBean.method}" oncomplete="dlg.hide()"/>

そしてbackingBean、次のことを行います(Primefaces Showcase を参照):

public void method() {
  // do something
  RequestContext context = RequestContext.getCurrentInstance();
  context.update(":mainForm");
}

mainFormすでに別のNamingContainerにあるかどうかを確認する必要があります。その場合は、context.update(...)それに応じて変更する必要があります。

mainFormさらに、バッキング Bean からを更新する場合はbackingBean、処理される入力に応じて、ダイアログを で非表示にすることもお勧めします。たとえば、一部のデータが無効な場合、ダイアログを隠したくありません。oncompleteサーバーからの応答を受信した後に自動的に実行されるアクションでは、現在これを行うことはできません。入力が正しいかどうかに関係なく、ダイアログが閉じます。

したがって、に追加しますmethod()

if (everythingWentFine) {
  context.execute("dlg.hide();");
}

から を削除oncompleteしますp:commandButton

于 2013-08-03T19:39:08.740 に答える