web-dev-qa-db-ja.com

PrimeFaces p:commandButtonを押したときのイベントの実行順序

PrimeFacesをクリックすると、JSF2 Beanメソッドを実行し、メソッドの完了後にダイアログボックスを表示しようとしています<p:commandButton>

<p:commandButton id="viewButton" value="View"
    actionlistener="#{userBean.setResultsForSelectedRow}" ajax="false"
    update=":selectedRowValues"
    oncomplete="PF('selectedRowValuesDlg').show()">
</p:commandButton>
<p:dialog id="selectedRowValues" widgetVar="selectedRowValuesDlg" dynamic="true">
    <h:outputText value="#{userBean.selectedGroupName}" />
</p:dialog>

コマンドボタンをクリックすると、BeanアクションリスナーメソッドsetResultsForSelectedRowが正しく実行されますが、メソッドの完了時にダイアログボックスは表示されません。 actionlistenerを削除すると、ダイアログボックスが表示されます。何が悪いのかわかりません。

イベントの実行順序は何ですか? actionlisteneroncompleteを同時に実行できますか?

31
Abhay

私はBalusCがここで提供するような情報を得るのが大好きです-そして彼はSO私が彼の言葉を福音と見なすような良い情報を持っている多くの人々を助けてくれますが、私はその順序を使用できませんでした私のプロジェクトでこれと同じ種類のタイミングの問題を解決するためのイベントを作成しました。BalusCがここにブックマークを付けた素晴らしい一般的な参照を置いたので、元のポスターの問題を解決するため、このコードが誰かに役立つことを願っています:

        <p:pickList id="formPickList" 
                    value="#{mediaDetail.availableMedia}" 
                    converter="MediaPicklistConverter" 
                    widgetVar="formsPicklistWidget" 
                    var="mediaFiles" 
                    itemLabel="#{mediaFiles.mediaTitle}" 
                    itemValue="#{mediaFiles}" >
            <f:facet name="sourceCaption">Available Media</f:facet>
            <f:facet name="targetCaption">Chosen Media</f:facet>
        </p:pickList>

        <p:commandButton id="viewStream_btn" 
                         value="Stream chosen media" 
                         icon="fa fa-download"
                         ajax="true"
                         action="#{mediaDetail.prepareStreams}"                                              
                         update=":streamDialogPanel"
                         oncomplete="PF('streamingDialog').show()"
                         styleClass="ui-priority-primary"
                         style="margin-top:5px" >
            <p:ajax process="formPickList"  />
        </p:commandButton>

ダイアログは、このフォームの外側のXHTMLの上部にあり、ダイアログに埋め込まれた独自のフォームと、ダイアログの準備が整ったときに準備が必要なメディアをストリーミングするための追加コマンドを保持するデータテーブルを備えています提示された。この同じ手法を使用して、ダイアログボックスのfileDownloadボタンを使用してユーザーのコンピューターにストリーミングする前に準備する必要があるカスタマイズされたドキュメントをダウンロードするなどのことを行うことができます。

私が言ったように、これはより複雑な例ですが、あなたの問題と私の問題のすべての高いポイントに当たります。コマンドボタンがクリックされると、結果は最初にバッキングBeanがpickListの結果で更新されることを保証し、次にバッキングBeanにピックリストでの選択に基づいてユーザーのストリームを準備するように指示し、次にコントロールを更新します更新された動的ダイアログに、ユーザーがコンテンツのストリーミングを開始できるようにダイアログボックスを表示します。

それの秘trickは、メインのcommandButtonにBalusCのイベントの順序を使用し、<p:ajax process="formPickList" />ビットが最初に実行されたことを確認します-pickListが最初にバッキングBeanを更新しない限り、何も正しく実行されないため(追加する前に私にとっては発生しなかった何か)。そのため、以前の、保留中の、および現在のコンポーネントとバッキングBeanに影響を与える可能性があるため、そのcommandButtonがロックします。しかし、それらすべてを相互に関連付けるタイミングは、ときどき処理するのが容易ではありません。

ハッピーコーディング!

8
FreedomRings