激活操作后,选项卡视图中的Primefaces确认dialolog不会隐藏

stg*_*stg 2 jsf primefaces jsf-2

我的确认对话框出了问题.单击确认按钮后它不会关闭.如果我的表单位于选项卡视图中,则只会发生这种情况.(令人兴奋的是,如果我的表单不在标签视图中,但只有一个面板或类似的东西,那么一些代码可以正常工作.)

        <h:form id="timingTableForm">
            <p:dataTable var="item" value="#{requestBean.rmRequest.timingList}" id="timingDataTable" editable="true">
             // some dataTable 
            </p:dataTable>
            <p:confirmDialog closable="true" appendToBody="true" id="confirmDialog" message="#{msg.conf_deleteyesno}" header="#{msg.conf_header}" severity="alert" widgetVar="confirmation">  
                <p:commandButton id="confirm" value="#{msg.btn_yessure}" update="timingTableForm" oncomplete="confirmation.hide()" actionListener="#{requestBean.deleteTiming}" process="@this"/>  
                <p:commandButton id="decline" value="#{msg.btn_notyet}" onclick="confirmation.hide()" type="button" />   
            </p:confirmDialog>
        </h:form>
Run Code Online (Sandbox Code Playgroud)

如果我将"oncomplete"更改为"onclick"它也可以正常工作,但我希望对话框在服务器端操作完成之前不会消失.

当我按下确认按钮时,在生成的HTML中发生了一些奇怪的事情:

<div id="mainTabView:timingTableForm:confirmDialog" class="ui-confirm-dialog ui-dialog ui-widget ui-widget-content ui-overlay-hidden ui-corner-all ui-shadow" style="width: auto; height: auto;">

<div id="mainTabView:timingTableForm:confirmDialog" class="ui-confirm-dialog ui-dialog ui-widget ui-widget-content ui-corner-all ui-shadow ui-overlay-visible" style="width: auto; height: auto; left: 994.5px; top: 186px; visibility: visible; z-index: 1006;">
Run Code Online (Sandbox Code Playgroud)

将呈现一个与我的确认对话框具有相同ID的新div.结果是一个隐藏的确认diolog(如预期的那样),但是还有一个仍然可见的新对话框.如果我再次按下确认按钮,我有2个隐藏的符合对话框和1个可见对话框等等...

难道我做错了什么?你能发现任何错误吗?或者这可能是素数面板中的错误?

  • Primefaces 3.4.1
  • 在GlassFish 3.1.2上运行
  • 浏览器Firefox 16.0.2

先谢谢你,Fant


其实我找到了解决问题的方法:

如果我尝试更新包含确认对话框的整个表单,则只会出现此问题.如果我只更新此表单中的某些特定区域,它可以正常工作.

Bal*_*usC 6

对话框不应放在任何表单内,而应放在任何表单之外并具有自己的表单.

<h:form id="timingTableForm">
    <p:dataTable var="item" value="#{requestBean.rmRequest.timingList}" id="timingDataTable" editable="true">
     // some dataTable 
    </p:dataTable>
</h:form>

<p:confirmDialog closable="true" appendToBody="true" id="confirmDialog" message="#{msg.conf_deleteyesno}" header="#{msg.conf_header}" severity="alert" widgetVar="confirmation">  
    <h:form>
        <p:commandButton id="confirm" value="#{msg.btn_yessure}" update="timingTableForm" oncomplete="confirmation.hide()" actionListener="#{requestBean.deleteTiming}" process="@this"/>  
        <p:commandButton id="decline" value="#{msg.btn_notyet}" onclick="confirmation.hide()" type="button" />   
    </h:form>
</p:confirmDialog>
Run Code Online (Sandbox Code Playgroud)

这是因为对话框的HTML表示可能会在真实的HTML DOM树中移动到当前表单之外(正如您明确指出的那样appendToBody="true"),这可能会在您遇到异步请求和更新期间导致"wtf"行为.