Primefaces DataTable - 使用对话框删除会删除错误的条目

kos*_*tja 1 jsf facelets java-ee primefaces jsf-2

我有一张表格.表中的一列显示一行按钮,用于编辑和删除表条目.当我删除一个条目时,从按钮的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>
Run Code Online (Sandbox Code Playgroud)

桌子:

<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>
Run Code Online (Sandbox Code Playgroud)

菜单栏:

<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>
Run Code Online (Sandbox Code Playgroud)

如果我用这个替换对话框,一切正常:

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

Dan*_*iel 6

<p:dialog>为每一行创建一个不是一个好主意.

对于初学者,你最好<p:dialog>在你的外面创造一个<p:dataTable>.

接下来我要做的是在删除按钮时设置bean中的id或行var,如果在对话框中确认,则使用该id或要从bean中删除的行var.

这是你的删除按钮的样子,设置downloadvar in prepareDataForDeletionaction并显示对话框......

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

关于你当前的异常:这是因为你的所有对话框都是相同的,widgetVar并且每个对话框都会覆盖先前声明的对话框,直到最后一个.您可以动态地为它们提供不同的窗口小部件名称widgetVar="deleteDlg_#{someIndex}",但是如果您只能在打开之前只有一个可重用的对话框,其内容已更新,则没有任何意义.