我在p:dialog
内打开了一个列表元素详细信息表单。此p:dialog
反过来显示另一个列表。从这个列表中,我可以在嵌套的p:dialog
中打开它的任何元素的详细信息。
问题是:每次打开对话框时,都会生成嵌套对话框中元素的一组新ID,并具有相同的值。
当我尝试从嵌套对话框(例如$('#manageIssue\\:newEventComment');
)中选择特定ID时,我在DOM中最终得到的是具有相同ID的数组元素。
我已经确定每次打开一个对话框都有一个副本,另外一个是从头开始的。
当嵌套对话框关闭时,嵌套对话框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工作(即从佣金清单中的佣金问题列表中添加评论事件):
答案 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>