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>

「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;">

私のconfirm-dialogと同じIDを持つ新しいdivがレンダリングされます。結果は(予想どおり)1つの非表示の確認ダイアログですが、まだ表示されている新しいダイアログもあります。確認ボタンをもう一度押すと、2つの非表示の適合ダイアログと1つの表示ダイアログなどがあります...

私は何か間違ったことをしていますか?エラーを見つけられますか?または、これはprimefacesのバグである可能性がありますか?

  • Primefaces 3.4.1
  • GlassFish3.1.2で実行
  • ブラウザFirefox16.0.2

よろしくお願いします、ファント


実際、私は自分の問題の解決策を見つけました:

この問題は、確認ダイアログも含まれているフォーム全体を更新しようとした場合にのみ発生します。このフォームの特定の領域のみを更新すると、正常に機能します。

4

1 に答える 1

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")。これにより、非同期の要求および更新中に「wtf」動作が発生する可能性があります。

于 2012-11-23T17:31:19.627 に答える