通过侦听器跟踪支持 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()
获取visible
a 的属性,该属性<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>