Primefaces确认Dialog没有在p:tabView

时间:2015-07-16 09:36:18

标签: jsf jsf-2 primefaces xhtml

我目前正在我们的自定义primefaces / jsf ui组件中集成p:confirmDialog。但是当在此层次结构中使用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内(失败)。

以下是我如何定义confirmDialog:

<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>

有什么想法吗?

1 个答案:

答案 0 :(得分:0)

这就是我解决问题的方法,请注意所有按钮都是基于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>