如果p:对话框打开,如何在backing bean中确定?

时间:2013-02-28 19:18:25

标签: jsf-2 primefaces

如果在浏览器中打开了Primefaces对话框,有没有办法告诉后备bean?

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

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

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

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

2 个答案:

答案 0 :(得分:5)

通过侦听器跟踪对话框在对象bean中的状态

您可以将对话框的打开状态保持为bean中的布尔值。

为此,您可以附加actionListerer <p:menuItem>属性,该属性将bean的布尔openStatus属性设置为true。要将该属性切换回false,基本上处理close,您可以使用适当定义的侦听器在<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>

通过<p:remoteCommand>

更新bean属性

dialogWidgetVar.show()dialogWidgetVar.hide()是完全客户端事件而言,组件的状态不包括对话框的“开放状态”。正如您可以从primefaces文档中获取dialog.isVisible()获取visible的{​​{1}}属性,该属性指示在页面加载时打开对话框。对于<p:dialog>方法,它只是检查视图中是否存在组件,并且也没有对您所关注的对话框状态的任何引用。

另请注意,将对话框绑定到dialog.isInView() would give rise to the infamous issue类型的支持组件变量。

尽管如此,如果您不想将额外的聆听者与org.primefaces.component.dialog.Dialog联系起来,那么最好的办法是使用menuitem来为您做更新。注意,应该存在关闭侦听器,以便将变量设置回false。

修改过的bean:

<p:remoteCommand>

修改后的观点:

@ManagedBean
@ViewScoped
public class DialogBean implements Serializable {

    private boolean openStatus = false;//getter + setter

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

}

答案 1 :(得分:0)

如果您想为所有开发人员透明地创建它,您可以创建可以完成工作的复合组件。

相关问题