1

フォームにテーブルがあります。テーブルの列の 1 つに、テーブル エントリを編集および削除するためのボタンの行が表示されます。actionボタンの属性からコントローラをコールするエントリを削除すると、期待どおりに動作します。

しかし、ユーザーが削除を確認できるダイアログを追加すると、間違ったエントリが削除されます。これは、常に現在のテーブルの最後のエントリです。理由がわかりませんDataTable var。ボタンとダイアログに同じものを使用しています。

私は JSF 2 (Mojarra 2.1.6) と Primefaces 3.5 を Suse 12.2 マシンの JBoss 7.1.1 にデプロイして作業しています。

フォーム:

<h:form id="downloads">
    <ui:include src="components/table.xhtml"/>
</h:form>

テーブル:

<ui:composition>

  <p:dataTable value="#{controller.currentLevelResources}"
            var="download" id="downloadTable" scrollHeight="120" rows="10">

    <p:column sortBy="#{download.name}">
        <f:facet name="header">Name</f:facet>
        <h:outputText id="downloadName" value="#{download.name}" title="#{download.description}" />
    </p:column>

            ...

    <p:column>
        <ui:include src="menuBar.xhtml"></ui:include>
    </p:column>

メニューバー:

<ui:composition>

        <p:commandButton id="edit"
            action="#{downloadEditController.editResource(download)}"
            icon="ui-icon-gear" title="Edit" oncomplete="updateStyles()"
            update=":downloads" />

        <p:commandButton id="delete" onclick="deletedDlg.show();"
            icon="ui-icon-trash" title="Delete" oncomplete="updateStyles()" />

        <p:dialog header="Delete confirmation" widgetVar="deletedDlg"
            resizable="false">
            <h:panelGroup layout="block" style="padding:5px;">
                <h:outputText
                    value="The Resource #{download} will be deleted. Proceed?" />
            </h:panelGroup>
            <p:commandButton id="deleteBtn" value="Delete"
                oncomplete="deletedDlg.hide(); updateStyles(); "
                action="#{downloadEditController.deleteResource(download)}"
                process="@this" update=":downloads">
            </p:commandButton>
            <p:commandButton value="Cancel" type="button"
                onclick="deletedDlg.hide();" />
        </p:dialog>

ダイアログをこれに置き換えると、すべてが機能します。

<p:commandButton id="delete" icon="ui-icon-trash" title="Delete" 
action="#{downloadEditController.deleteResource(download)}" 
oncomplete="updateStyles()" update=":downloads" />
4

1 に答える 1

6

<p:dialog>for every 行を作成することはお勧めできません。

手始めに<p:dialog><p:dataTable>.

次に行うことは、削除ボタンのクリック時にBeanにIDまたは行変数を設定し、ダイアログで確認する場合は、そのIDまたはBeanの行変数を使用して削除することです。

これは、削除ボタンがどのように見えるか、変数を設定しdownloadprepareDataForDeletionダイアログを表示する方法です...

<p:commandButton id="deleteConfirmation" icon="ui-icon-trash" title="Delete" 
    action="#{downloadEditController.prepareDataForDeletion(download)}" 
    onsucess="deletedDlg.show();"/>

あなたの現在の異常について:それは、すべてのダイアログが同じwidgetVarであり、次の各ダイアログが以前に宣言されたものを最後のものまでずっとオーバーライドしているためです。so のように異なるウィジェット名を動的に付けることができますがwidgetVar="deleteDlg_#{someIndex}"、開く前にコンテンツが更新される再利用可能なダイアログが 1 つしかない場合、これは意味がありません。

于 2013-04-09T08:17:29.653 に答える