7

Primefaces ダイアログがブラウザで開かれている場合、バッキング Bean から通知する方法はありますか?

これは、facelet でダイアログを表示する方法です。

<p:menuitem value="Click me" oncomplete="dialogWidget.show();" />

から Dialog オブジェクトを検索すると、ダイアログが表示されていなくても、 と のViewRoot両方が truedialog.isVisible()dialog.isInView()返します。または、メイン ウィンドウがグレー表示されているかどうかを示すフラグはありますか (これは、モーダル ダイアログが表示されている場合に発生します)。

背景情報: FacesMessages を表示する場所を見つけようとしています。私のアプリケーションは、メイン ウィンドウまたはダイアログ ポップアップの 2 つの場所にメッセージを表示できます。モーダル ダイアログが開いているときに、メッセージがダイアログにのみ表示されるようにします。ダイアログが表示されない場合は、メッセージをメイン ウィンドウに表示します。

4

2 に答える 2

5

リスナーを介してバッキング Bean でダイアログのステータスを追跡する

ダイアログのオープンステータスを Bean のブール変数として保持できます。

このために、Bean の booleanプロパティを trueに設定するactionListerer属性をアタッチできます。そのプロパティを false に戻し、基本的にクローズを処理するには、適切に定義されたリスナーを使用してネストできます。<p:menuItem>openStatus<p:ajax event="close" listener="#{dialogBean.dialogClosed}"><p:dialog>

豆:

@ManagedBean
@ViewScoped
public class DialogBean implements Serializable {

    private boolean openStatus = false;//getter + setter

    public void dialogOpened(ActionEvent event) {
        openStatus = true;
    }

    public void dialogClosed(CloseEvent event) {
        openStatus = false;
    }

}

景色:

<h:form>
    <p:menu>
        <p:menuitem value="Open dialog" oncomplete="dialog.show();" update="dialogopen"/>
    </p:menu>
    <p:dialog widgetVar="dialog">
        <h:outputText value="This is your dialog"/>
        <p:ajax event="close" listener="#{dialogBean.dialogClosed}" update="dialogopen"/>
    </p:dialog>
    <h:outputText id="dialogopen" value="Is dialog open? #{dialogBean.openStatus}"/>
</h:form>

Bean プロパティの更新<p:remoteCommand>

dialogWidgetVar.show()およびdialogWidgetVar.hide()が完全にクライアント側のイベントである限り、コンポーネントの状態にはダイアログの「オープン状態」は含まれません。Primefaces ドキュメントから取得できるように、ページの読み込み時にダイアログを開くように指示するa の属性をdialog.isVisible()取得します。メソッドに関しては、コンポーネントがビューに存在するかどうかを確認するだけであり、それはあなたが求めているダイアログの状態への参照もありません。visible<p:dialog>dialog.isInView()

org.primefaces.component.dialog.Dialog また、タイプのバッキング コンポーネント変数にダイアログをバインドすると、悪名高い問題が発生することにも注意してください。

それにもかかわらず、余分なリスナーを に接続したくない場合は、更新を行うmenuitemを使用するのが最善の策です。<p:remoteCommand>変数が false に戻されるように、近いリスナーが存在する必要があることに注意してください。

変更された Bean:

@ManagedBean
@ViewScoped
public class DialogBean implements Serializable {

    private boolean openStatus = false;//getter + setter

    public void dialogClosed(CloseEvent event) {
        openStatus = false;
    }

}

変更されたビュー:

<h:form>
    <p:menu>
        <p:menuitem value="Open dialog" oncomplete="dialog.show(); updateOpenStatus();"/>
    </p:menu>
    <p:dialog widgetVar="dialog">
        <h:outputText value="This is your dialog"/>
        <p:ajax event="close" listener="#{dialogBean.dialogClosed}" update="dialogopen"/>
    </p:dialog>
    <p:remoteCommand name="updateOpenStatus" update="dialogopen">
        <f:setPropertyActionListener value="#{true}" target="#{dialogBean.openStatus}"/>
    </p:remoteCommand>
    <h:outputText id="dialogopen" value="Is dialog open? #{dialogBean.openStatus}"/>
</h:form>
于 2013-02-28T19:48:36.853 に答える
0

すべての開発者に対して透過的に実行したい場合は、ジョブを実行する複合コンポーネントを作成できます。

于 2013-03-01T06:05:35.300 に答える