解决方案在这里。(在 bean 中显示和隐藏dialog
。)
我有一个dialog
和显示/隐藏按钮,效果很好。对话框boolean
从支持 bean 读取值并更新它的visible
属性(使其显示或隐藏)。一切正常,直到我使用默认关闭按钮关闭对话框,该按钮触发 ajaxclose
事件。从那一刻起,显示/隐藏按钮不起作用,或者对话框没有更新它的visible
状态。它永远关闭。
我发现,在触发 ajax 事件后,除了对话框visible
属性之外的所有内容都会正确更新。按钮工作正常,它们正确更新支持 bean(我可以在日志文件中看到它),并且对话面板也正确更新(我可以看到showDialog
屏幕上显示的正确值)。
我知道还有其他方法可以显示/隐藏对话框,但我真的很好奇在这种情况下发生了什么——为什么它会这样工作?有没有办法通过从 bean 读取可见性值来显示对话框(以及在对话框关闭时更新 bean 值更重要的是什么)?
我的 XHTML:
<h:form>
<p:commandButton value="show d1" actionListener="#{testBean.enableShowDialog()}" update=":dialogId"/>
<p:commandButton value="hide d1" actionListener="#{testBean.disableShowDialog()}" update=":dialogId"/>
</h:form>
<p:outputPanel id="dialogId">
showDialog value = #{testBean.showDialog}
<p:dialog header="d1" visible="#{testBean.showDialog}">
<p:ajax event="close" listener="#{testBean.disableShowDialog()}" update=":dialogId"/>
test
</p:dialog>
</p:outputPanel>
和支持bean:
@ManagedBean
@ViewScoped
public class TestBean implements Serializable {
private static final Logger LOGGER = LoggerFactory.getLogger("TB");
private boolean showDialog;
public boolean isShowDialog() {
LOGGER.info("getter isShowDialog={}", showDialog);
return showDialog;
}
public void enableShowDialog() {
showDialog = true;
LOGGER.info("isShowDialog set to true");
}
public void disableShowDialog() {
showDialog = false;
LOGGER.info("isShowDialog set to false");
}
}