如果在浏览器中打开了Primefaces对话框,有没有办法告诉后备bean?
这是我在facelet上显示对话框的方式:
<p:menuitem value="Click me" oncomplete="dialogWidget.show();" />
当我从ViewRoot
查找Dialog对象时,即使未显示对话框,dialog.isVisible()
和dialog.isInView()
也会返回true。或者,是否有一个标志告诉我主窗口是否显示为灰色(当显示模式对话框时会发生这种情况)?
背景信息:我正在试图找出显示FacesMessages的位置。我的应用程序可以在两个位置显示消息:主窗口或对话框弹出窗口。打开模式对话框时,我希望消息仅显示在对话框中。如果没有显示对话框,我希望消息显示在主窗口中。
答案 0 :(得分:5)
您可以将对话框的打开状态保持为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>
就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)
如果您想为所有开发人员透明地创建它,您可以创建可以完成工作的复合组件。