【问题标题】:PrimeFaces 4.0: Dialog.show() has no effectPrimeFaces 4.0:Dialog.show() 没有效果
【发布时间】:2014-03-18 17:03:29
【问题描述】:

因此我有一个对话框:

        <p:dialog id="pinDialog" widgetVar="pinDialog" width="800" binding="#{userBean.pinCheckDialog}" closable="false" modal="true" closeOnEscape="false" showEffect="clip" hideEffect="clip">
            <h:form id="pinEntry">
                <p:messages for="messagesForPinCheck"/>
                <p:outputLabel for="pinCode" value="#{messages.PinCodeRequired}"/>
                <p:inputText value="#{userBean.enteredPin}" size="4" id="pinCode"/>
                <p:commandButton value="#{messages.PinCodeSubmit}" update="@form" action="#{userBean.submitPin()}"/>
            </h:form>
        </p:dialog>

idleMonitor 内,我在userBean 上调用active()idle()。如果用户空闲并且其他条件成立,我想显示pinDialog

        if (isPinRequired()) {
            logger.debug("pin required, attempting to show pin dialog");
            RequestContext.getCurrentInstance().execute("pinDialog.show()");
        }

出现日志消息,但屏幕上没有任何反应。我也尝试过PF('pinDialog').show,但没有成功。我做错了什么?

【问题讨论】:

    标签: java jsf-2 primefaces


    【解决方案1】:

    如果您想在页面加载之外的其他时间显示对话框,那么您将需要在对话框表单上使用“render”属性。

    <p:panelGroup id="mainPanel">
       <p:dialog rendered="#{myBean.showForm}"
       </p:dialog>
    </p:panelGroup>
    

    其中 showForm 是您的支持 bean 中的布尔函数,通常返回 false。

    如果没有外部的 p:panelGroup 和 p:dialog 通常渲染为 false,即使将渲染设置为 true,它也永远不会显示。

    【讨论】:

    • 这与来自JSF Conditional Rendering 的答案冲突,其中渲染必须最初为真(默认值),以便随后的任何操作找到它。设置为 false 时,服务器不会生成任何 HTML 供 Javascript DOM 操作查找。
    • @jmkgreen 这就是我有外部 p:panelGroup 的原因,在这种情况下,所有的 html 都是在对话框不呈现的情况下构建的......这是从你给我的那个链接复制/粘贴“你需要将它包装在一个始终呈现的容器组件中,因此在 HTML DOM 树中始终可用。”
    • 所以 JSF 将 HTML 发送到浏览器(没有对话框)。接下来我们在bean内执行什么?无法使用 RequestContext.getCurrentInstance().execute("pinDialog.show()");,因为浏览器在 DOM 树中不再有 pinDialog。您是不是建议我们可以在对话框上动态设置rendered,它会出现在浏览器中?
    • 也许我的方法会过于复杂,但是您是否按照primefaces.org/showcase/ui/idleMonitor.jsf 教程进行操作?你的例子看起来有点不同。此外,您的 p:dialog 中有一个 h:form,我只能假设它位于另一个 h:form 中,这意味着您将有嵌套的表单,这是一件坏事。尝试删除表单标签
    • 是的,我一直在针对本教程进行测试。很多年前我就被嵌入式表单烧死了。现在我正在将idleMonitor 转换为使用p:ajax,希望我可以打开对话框客户端。
    猜你喜欢
    • 2012-04-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-04-19
    • 2014-02-08
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多