Primefaces嵌套p:对话框DOM节点重复

时间:2015-10-28 21:16:41

标签: ajax jsf primefaces jquery-ui-dialog

我在p:dialog内打开了一个列表元素详细信息表单。此p:dialog反过来显示另一个列表。从这个列表中,我可以在嵌套的p:dialog中打开它的任何元素的详细信息。

问题是:每次打开对话框时,都会生成嵌套对话框中元素的一组新ID,并具有相同的值。

当我尝试从嵌套对话框(例如$('#manageIssue\\:newEventComment');)中选择特定ID时,我在DOM中最终得到的是具有相同ID的数组元素。

enter image description here

我已经确定每次打开一个对话框都有一个副本,另外一个是从头开始的。

当嵌套对话框关闭时,嵌套对话框DOM节点不会被销毁,每次打开对话框时都会生成一个带有重叠ID的新集

此问题与primefaces update attribute not working on modal dialog opened from modal dialog有关。

(我通过从表单中删除prependId属性解决了原始问题,但这个仍然存在。)

因为这个问题有点难以重现,所以我建立了一个MCVE。所有的东西(支持bean,视图,pom.xml等)总共添加了大约500行代码,所以我在github repo上分享了它:https://github.com/elcodedocle/testt

这里的问题归结为:

如何在不使用此行的情况下使MCVE工作(即从佣金清单中的佣金问题列表中添加评论事件):

https://github.com/elcodedocle/testt/blob/fbfeb7fca474c66c202c92e469ca185c6bf569c2/src/main/webapp/views/widgets/issue_detail_edit.xhtml#L21

1 个答案:

答案 0 :(得分:4)

此问题是由嵌套的<p:dialog>引起的。

<p:dialog id="commissionDetail">
    ...
    <p:dialog id="issueDetail">
        ...
    </p:dialog>
</p:dialog>

这是不允许的。技术原因是,表示对话框的HTML DOM元素是通过JavaScript重定位到<body>的最后,以确保最佳的跨浏览器兼容性,以计算z-index和offset。然后,当您更新对话框时,现有的对话框无法在DOM中的原始父元素中找到,因此只需将新的对话框添加到DOM(然后再将其重新定位到正文的末尾,等等) )。

您确实需要重新构建模板,以便最终结束

<p:dialog id="commissionDetail">
    ...
</p:dialog>
<p:dialog id="issueDetail">
    ...
</p:dialog>