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

时间:2012-11-23 14:49:34

标签: jsf jsf-2 primefaces

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

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

如果我将“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;">

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

我做错了吗?你能发现任何错误吗?或者这可能是表面中的错误?

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

提前谢谢你, 凡特


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

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

1 个答案:

答案 0 :(得分: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>

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