Primefaces v.5.3.5 确认在主要 h:form 和主窗体内部呈现对话框渲染问题,但它无法正常工作

Primefaces v.5.3.5 confirm dialog render issue outside main h:form and inside main form is rendered but it is not working properly

我正在使用 PF v.5.3.5 和 JSF v.2.2.8。这是 SO 中的一个常见话题。我注意到 PF v.5.3.5 文档中存在与 appendTo 属性相关的错误。

第一种方法

呈现 p:confirmDialog 并呈现命令按钮,但如果将其放置在嵌套 h:form.

中,则操作不起作用且消息不会呈现

第二种方法

如果我将此对话框放在主 h:form 之外,如果我添加 global="true" 属性,它也根本不会呈现。

第三种方法

呈现 p:confirmDialog 并呈现命令按钮,但如果移除嵌套的 h:form,则操作不起作用且呈现消息。

<h:form>
...
                <p:confirmDialog id="askSessionDialog1" widgetVar="askSessionDialog1" severity="alert"
                                 appendTo="@(body)" rendered="#{treeData.askSessionDialogRendered}" visible="#{treeData.askSessionDialogRendered}">
                    <h:form>
                    <f:facet name="message">
                        <h:outputText value="#{msg.WEB_ADMIN_PAGES_TREESEGMENT_NOSESSION}" escape="false"/>
                    </f:facet>

                        <p:commandButton value="#{msg.WEB_BUTTONS_OK}" action="#{treeData.save(false, true)}" icon="fa fa-check"
                                         update="@(form)" type="button" />
                        <p:commandButton value="#{msg.WEB_BUTTONS_CANCEL}" action="#{treeData.setAskSessionDialogRendered(false)}"
                                         icon="fa fa-close" onclick="PF('askSessionDialog1.hide()')" update="@(form)" type="reset" />
                    </h:form>
                </p:confirmDialog>
...
</h:form>

后端部分

setAskSessionDialogRendered(true);
RequestContext.getCurrentInstance().update("treeSegmentForm askSessionDialog askTurnOffDialog askSessionDialog1 askTurnOffDialog1");

提前感谢建设性的帖子和评论。

已解决 这是目前最适合我的方法。

<h:form>
...
<p:confirmDialog id="askSessionDialog" widgetVar="askSessionDialog" severity="alert"
                                 appendTo="@(body)" rendered="#{treeData.askSessionDialogRendered}" visible="#{treeData.askSessionDialogRendered}">
                    <f:facet name="message">
                        <h:outputText value="#{msg.WEB_ADMIN_PAGES_TREESEGMENT_NOSESSION}" escape="false"/>
                    </f:facet>

                    <h:form>
                        <p:commandButton value="#{msg.WEB_BUTTONS_OK}" icon="fa fa-check" type="button" accesskey="o">
                            <p:ajax event="click" listener="#{treeData.save(false, true)}" oncomplete="PF('askSessionDialog').hide()"
                                    update="@(form)" />
                        </p:commandButton>
                        <p:commandButton value="#{msg.WEB_BUTTONS_CANCEL}" icon="fa fa-close" type="reset" accesskey="c">
                            <p:ajax event="click" listener="#{treeData.setAskSessionDialogRendered(false)}"
                                    onsuccess="PF('askSessionDialog').hide()" update="@(form)" />
                        </p:commandButton>
                    </h:form>
                </p:confirmDialog>
...
</h:form>

后端

setAskSessionDialogRendered(true);
RequestContext.getCurrentInstance().update("treeSegmentForm");

特别感谢:@YagamiLight 他帮助我开始了我的解决方案。