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>不是一个好主意。

对于初学者,您最好<p:dialog><p:dataTable>.

接下来我要做的是在单击删除按钮时在您的 bean 中设置id 或行 var,如果在对话框中确认,请使用该id 或来自 bean 的行 var来删除。

这就是删除按钮的外观,设置downloadvarprepareDataForDeletion并显示对话框...

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

关于您当前的异常情况:这是因为您的所有对话框都相同widgetVar,并且下一个对话框一直覆盖先前声明的对话框,直到最后一个对话框。你可以像这样动态地给它们一个不同的小部件名称widgetVar="deleteDlg_#{someIndex}",但是如果你只能有一个可重用的对话框,它的内容在打开之前会更新,那么这是没有意义的。

于 2013-04-09T08:17:29.653 回答