2

Web UI プロジェクトに PrimeFaces UI ライブラリを使用しています。

ボタンのあるmanage_watchfolder.xhtmlページがあり、このボタンでダイアログが起動します。

<p:commandButton value="Add" oncomplete="dlgEditWF.show()" update=":editWFForm">  
    <f:param value="#{item.value.ID}" name="editId"/>
    <h:graphicImage value="./edit.png" />
</p:commandLink>

dlgEditWFから含めたこの同じファイル内にedit_watchfolder.xhtml

<p:dialog id="editDialog" widgetVar="dlgEditWF" dynamic="true">
    <ui:include src="edit/edit_watchfolder.xhtml"/>
</p:dialog> 

ボタンがクリックされる前に読み込まれdynamic=="true"ないようにするために使用しています。edit_watchfolder.xhtml

editWFFormのフォームですedit_watchfolder.xhtml

問題は、ダイアログを初めて起動したときに、edit_watchfolder.xhtmlバッキング Bean (スコープ指定されたリクエスト) が 2 回作成されることです。最初はeditId(上記のコードを参照) で渡された値は問題ありませんが、2 回目はそこにないため、バッキング Bean は間違った値を取得します。

親ページ(OKまたはCancelボタン) に戻ってダイアログを再度起動すると、問題はなくなり、すべて問題ありません。問題は最初の起動のみのようです。

最初のダイアログが起動されたときにバッキング Bean が 2 回作成されるのはなぜですか?

4

2 に答える 2

1

これは、ダイアログを初めて開いたときに、実際のコンテンツをロードするためにAJAXリクエストが送信されるためです。ここで唯一合理的なのは、@ViewScoped両方の要求を処理するBeanを使用することです。最初はによって起動されcommandButton、secondsはによって起動されdlgEditWF.show()ます。もちろん、削除した場合、dynamic="true"リクエストは1つだけになります。

于 2013-02-21T12:22:01.353 に答える
1

I suspect that this is because of how the Primefaces dynamic functionality works.

The first request by the commandButton will send the request parameter with the editID to load. After this request occurs and the response is received and the page elements are updated, the oncomplete javascript occurs which displays the dialog.

Once the dialog is displayed an entirely different request occurs to dynamically load the contents of the dialog, except this time there is no editID parameter. Your bean is @RequestScoped therefore it is being created twice and the second time it does not retain the editID request parameter.

There are three possible solutions:

  1. Remove the dynamic attribute from your dialog

  2. Change your bean to @ViewScoped or @SessionScoped.

  3. Change the editID request parameter to a bean property in a @SessionScoped managed bean.

于 2013-02-21T12:27:19.237 に答える