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

cit*_*ess 7 primefaces jsf-2

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

这就是我在facelet上显示一个对话框的方法:

<p:menuitem value="Click me" oncomplete="dialogWidget.show();" />
Run Code Online (Sandbox Code Playgroud)

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

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

sku*_*sel 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;
    }

}
Run Code Online (Sandbox Code Playgroud)

风景:

<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>
Run Code Online (Sandbox Code Playgroud)

通过更新bean属性 <p:remoteCommand>

就客户端事件而言,dialogWidgetVar.show()并且dialogWidgetVar.hide()是完全客户端事件,组件的状态不包括对话的"开放状态".正如你可以从primefaces文档中dialog.isVisible()获得a的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;
    }

}
Run Code Online (Sandbox Code Playgroud)

修改后的观点

<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>
Run Code Online (Sandbox Code Playgroud)