当前位置: 首页 > 知识库问答 >
问题:

PrimeFaces对话框框架-使用remoteCommand关闭对话框,未激发父方法

锺离德运
2023-03-14

JSF2.2;PrimeFaces 5.3

我的目标是通过单击X按钮捕获用户关闭对话框,返回到父页面,以便刷新数据并更新表单。

我能够让p:remoteCommand调用DialogBean中的confirmAndCloseDialog()方法,但从未调用ParentBean中的onDialogReturn()方法。为什么不调用onDialogReturn?我能让它工作吗?

顺便说一句,如果用户以正常方式退出对话框,即通过单击p:commandButton(close dialog)关闭对话框,则所有符号都可以。

这是我的代码。

谢谢你!

父页面:

<h:form>
...
    <p:commandButton value="Open dialog" 
                     id="openDialogButton"                                   
                     actionListener="#{parentBean.openDialog()}"
                     update="@form">
        <p:ajax event="dialogReturn"
                listener="#{parentBean.onDialogReturn}"
                update="@form"/>
    </p:commandButton>
...
</h:form>

对话框页面:

<body style="height: 80%;" onunload="userClickOnX();" >
    <h:form id="aForm">
         <p:remoteCommand id="userClickOnX" 
                          name="userClickOnX" 
                          actionListener="#{dailogBean.confirmAndCloseDialog}"/>
       ......
         <p:commandButton id="closeDialog" 
                          value="CLOSE DIALOG" 
                          actionListener="#{dialogBean.confirmAndCloseDialog}"/>
    </h:form>
</body>

菜豆

public void openDialog() {
    Map<String, Object> options = new HashMap<>();
    options.put("modal", true);
    options.put("draggable", true);
    options.put("resizable", true);
    options.put("closable", true);
    options.put("contentWidth", "100%");
    options.put("contentHeight", "100%");
    options.put("width", 1000);
    options.put("height", 800);
    RequestContext.getCurrentInstance().openDialog("dialog", options, null);
}

public void onDialogReturn(SelectEvent event) {
   refresh data ....
}

对话豆:

public void confirmAndCloseDialog() {
    RequestContext.getCurrentInstance().closeDialog(objectForParent);
}

共有2个答案

子车雅珺
2023-03-14

您是否设置了对话框配置?根据:http://www.primefaces.org/docs/guide/primefaces_user_guide_5_3.pdffaces-config.xml

<application>
 <action-listener>
org.primefaces.application.DialogActionListener
 </action-listener>
 <navigation-handler>
org.primefaces.application.DialogNavigationHandler
 </navigation-handler>
 <view-handler>
org.primefaces.application.DialogViewHandler
 </view-handler>
</application>

另外,你的:应该在对话框div/construction中,而不是在你选择的按钮中。

柳翼
2023-03-14

4年后,Primeface的对话框框架默认可关闭的“X”按钮仍然只是一个链接,并使用javascript来隐藏对话框,这就是为什么使用该按钮时不会触发对话返回事件。我不知道“拦截”它的动作的方法。所以如果你不想让一个自定义按钮关闭你的对话框,你就倒霉了,但是你总是可以重新发明轮子,有点像:

  • 复制Primeface的按钮并使其更好:)
<h:body>
  <h:form id="formToolbar">
    <a class="ui-dialog-titlebar-icon ui-dialog-titlebar-close ui-corner-all" href="#" 
        role="button"
        style="float: right; position: relative; top: -10px; left: -3px; color: #757575;" 
        onclick="close()">
      <span class="ui-icon ui-icon-closethick"></span>
    </a>
    <p:remoteCommand id="close" name="close" action="#{dialogController.close()}"> 
    </p:remoteCommand>
  </h:form>
  ...
<h:body>

你可以根据自己的喜好调整位置和颜色

  • 在对话框bean中:
public void close() {
  PrimeFaces.current().dialog().closeDynamic(null);
}
  • 现在,您可以在父页面和相应的bean中看到returnDialog事件
<p:commandButton action="#{parentBean.openDialog(param)}">
  <p:ajax event="dialogReturn" listener="#{parentBean.handleReturn()}"/>
</p:commandButton>
  • 打开对话框时,请记住将closable设置为false,否则将有两个“X”按钮:
Map<String,Object> options = new HashMap<String, Object>();
options.put("closable", false);
options.put("draggable", false);
PrimeFaces.current().dialog().openDynamic(
    "dialog",
    options,
    null)

PS:我也将draggable设置为false,您仍然可以使用draggable模式,但这会在对话框顶部创建一个在对话框页面内无法访问的栏,因此您的“X”按钮将更靠近底部,这在美学上不令人满意。希望拖动不是必须的。

 类似资料:
  • 我想通过Remote tecommand操作打开一个对话框,并从页面后备bean中的中获取值。远程命令在页面加载时正确触发bb中的actionListener 使用此show Dialog方法也可以正确显示对话框: 在另一个Bean中: 问题是,我不知道如何聆听由以下事件引发的事件: 在PF示例中http://www.primefaces.org/showcase/ui/dialogFramewo

  • 我们在WebLogic11g下使用JSF2.1+PrimeFaces6.0+PrimeFaces-Extensions6.0.0、mojarra 2.1.7。 单击p:commandButton后,DOM inspector显示对话框已在正文和html标记之外创建,如下一个图像所示: 在正文外部呈现的对话框 如果我们使用相同的代码(没有帧)创建一个新的.xhtml,并单击p:commandButt

  • 我想在我的编码中添加对话框。对话框可以弹出。假设用户按下ok按钮后对话框将关闭,但对话框将自动关闭。这是我的密码。有什么问题吗?

  • 我有一个JFrame调用一个新的JDialog,这个JDialog有一个关闭它的按钮。 当JDialog关闭时,JFrame应该重新绘制。但是当我用按钮关闭JDialog时,什么也不会发生,当我用经典的“X”按钮关闭时,就不会发生这种情况。 这是来自JFrame的windowListener: 这里是JDialog中关闭JDialog的按钮的代码: 就像我说的,监听器中的JFrame需要在JDia

  • 对话框的内容不是在页面最初可见,而是在用户操作时显示额外的信息。 Toasts Materialize 提供了非常简单的方法,来弹出一些信息,同时也不会让用户感到突兀。这些 Toasts 显示的位置和大小会随着你的设备的不同而改变。 在 JavaScript 中调用 Materialize.toast() 方法来使用。 // Materialize.toast(message, displayLe