【问题标题】:Primefaces confirmDialog doesn't show inside p:tabViewPrimefaces confirmDialog 不显示在 p:tabView 中
【发布时间】:2015-10-05 16:24:03
【问题描述】:

我目前正在将 p:confirmDialog 集成到我们的自定义 primefaces / jsf ui 组件中。但是当在这个层次结构中使用 p:confirmDialog 时它失败了:

p:panel
    p:tabView
        p:tab
            h:form
                p:panel
                    h:panelGroup
                        h:panelGroup
                            p:commandButton
                            p:confirmDialog

在其他形式上它成功了:

h:form      
    p:panel
        h:panelGroup
            h:panelGroup
                p:commandButton
                p:confirmDialog                 
        p:panel
            p:tabView
                p:tab

请注意,最明显的区别之一是 h:form 的定义位置,而 confirmDialog 位于 tabView 内(失败)。

我是这样定义确认对话框的:

<p:commandButton id="saveButtonWithMessage"
            rendered="#{cc.attrs.edit and !empty(cc.attrs.backingBean.objectId) and !empty(cc.attrs.updateConfirmationMessage)}"
            value="#{messages['action.save']}" icon="ui-icon-check"
            onclick="PF('saveButtonWithMessageDialog').show();">
</p:commandButton>

<p:confirmDialog message="#{cc.attrs.updateConfirmationMessage}"
    widgetVar="saveButtonWithMessageDialog" showEffect="fade"
    hideEffect="fade">
    <p:commandButton ajax="#{cc.attrs.ajaxSubmit}"
        value="#{messages['commons.yes']}" styleClass="ui-confirmdialog-yes"
        icon="ui-icon-check" oncomplete="saveButtonWithMessageDialog.hide()"
        action="#{cc.attrs.backingBean.saveOrUpdate(cc.attrs.killConversationOnSave)}">
        <f:param name="edit" value="#{cc.attrs.edit}" />
    </p:commandButton>
    <p:commandButton value="#{messages['commons.no']}" type="button"
        styleClass="ui-confirmdialog-no" icon="ui-icon-close"
        onclick="PF('saveButtonWithMessageDialog').hide()" />
</p:confirmDialog>

在第二个例子中,浏览器成功发送请求并得到响应,但它卡在灰色的模态屏幕上。

这是我得到的部分回复:

<partial-response>
    <changes>
        <update id="tabView:j_idt625"><div id="tabView:j_idt625" class="ui-messages ui-widget" aria-live="polite"></div></update>
        <update id="tabView:j_idt680"><div id="tabView:j_idt680" class="ui-messages ui-widget" aria-live="polite"></div></update>
        <update id="tabView:j_idt732"><div id="tabView:j_idt732" class="ui-messages ui-widget" aria-live="polite"></div></update>
        <update id="tabView:j_idt788"><div id="tabView:j_idt788" class="ui-messages ui-widget" aria-live="polite"></div></update>
        <update id="javax.faces.ViewState">3685613370368244617:-6252032147041871407</update>
    </changes>
</partial-response>

有什么想法吗?

【问题讨论】:

    标签: jsf jsf-2 primefaces xhtml


    【解决方案1】:

    这就是我解决问题的方法,请注意所有按钮都是基于 ajax 的。要从confirmDialog 导航到另一个页面,我需要创建一个触发remoteCommand 的按钮,remoteCommand 调用一个backingBean 操作,该操作返回一个在faces-config.xml 中定义的字符串导航。

    <!-- Update with message -->
    <p:remoteCommand id="remoteUpdateWithMessageButton"
        action="#{backingBean.action}"
        name="updateWithMessage" oncomplete="handleUpdateWithMessageComplete(xhr,status,args)" />
    <p:commandButton id="saveButtonWithMessage"
        rendered="#{trueOrFalse}"
        value="Save" icon="ui-icon-check"
        oncomplete="PF('saveButtonWithMessageDialog').show()">
    </p:commandButton>
    <!-- Update the message handling when  -->
    <p:confirmDialog id="confirmUpdateWithMessage" appendTo="@(body)"
        widgetVar="saveButtonWithMessageDialog" showEffect="fade"
        hideEffect="fade" severity="alert"
        message="#{(cc.attrs.updateConfirmationMessage eq '') ? messages['confirmationMessage.confirmUpdate'] : cc.attrs.updateConfirmationMessage}">
        <p:commandButton id="updateOk" value="yes"
            styleClass="ui-confirmdialog-yes" icon="ui-icon-check"
            oncomplete="updateWithMessage()"
            onclick="PF('saveButtonWithMessageDialog').hide()">
        </p:commandButton>
        <p:commandButton id="updateKO" value="#{messages['commons.no']}"
            type="button" styleClass="ui-confirmdialog-no" icon="ui-icon-close"
            onclick="PF('saveButtonWithMessageDialog').hide()" />
    </p:confirmDialog>
    <!-- Update with message -->
    
    <script type="text/javascript">
    //<![CDATA[
        function handleUpdateWithMessageComplete(xhr, status, args) {
            var result = args.result;
            if(typeof(result)!="undefined" && !result){
                PF('confirmCannotUpdateWithMessageDialog').show();
            }
        }
    //]]>
    </script>
    

    【讨论】:

      猜你喜欢
      • 2014-08-10
      • 1970-01-01
      • 2020-06-18
      • 2015-07-17
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-02-11
      • 2014-03-16
      相关资源
      最近更新 更多