7

如果在浏览器中打开了 Primefaces 对话框,有没有办法从支持 bean 中判断?

这就是我在 facelet 上显示对话框的方式:

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

当我从 中查找 Dialog 对象时,即使未显示对话框ViewRoot,两者dialog.isVisible()和都返回 true。dialog.isInView()或者,是否有一个标志告诉我主窗口是否变灰(显示模式对话框时会发生这种情况)?

背景信息:我正在尝试找出在哪里显示我的 FacesMessages。我的应用程序可以在 2 个位置显示消息:主窗口或对话框弹出窗口。打开模式对话框时,我希望消息仅显示在对话框中。如果没有显示对话框,我希望消息显示在主窗口中。

4

2 回答 2

5

通过侦听器跟踪支持 bean 中的对话框状态

您可以将对话框的打开状态保留为 bean 中的布尔变量。

为此,您可以附加一个actionListerer属性<p:menuItem>,将 bean 的布尔openStatus属性设置为 true。要将该属性切换回 false,本质上是处理关闭,您可以使用适当定义的侦听器嵌套<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 文档中获得的那样,dialog.isVisible()获取visiblea 的属性,该属性<p:dialog>指示在页面加载时打开对话框。至于dialog.isInView()方法,它只是检查组件是否存在于视图中,并且也没有对您所追求的对话框状态的任何引用。

另请注意,将您的对话框绑定到类型的支持组件变量org.primefaces.component.dialog.Dialog 会引起臭名昭著的问题

尽管如此,如果您不想将额外的侦听器连接到menuitem,最好的办法是使用<p:remoteCommand>,它会为您完成更新。请注意,应该存在关闭侦听器,以便将变量设置回 false。

改良豆:

@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 回答