我有一张表格。表中的一列显示一行按钮,用于编辑和删除表条目。当我删除一个条目时,从按钮的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" />
答案 0 :(得分:6)
为每一行创建<p:dialog>
并不是一个好主意。
对于初学者,您最好在<p:dialog>
之外创建一个<p:dataTable>
。
接下来我要做的是在删除按钮单击时在bean中设置 id或row var ,如果在对话框中确认 id或row var < / em>从bean到删除。
这是删除按钮的样子,在download
操作中设置prepareDataForDeletion
var并显示对话框...
<p:commandButton id="deleteConfirmation" icon="ui-icon-trash" title="Delete"
action="#{downloadEditController.prepareDataForDeletion(download)}"
onsucess="deletedDlg.show();"/>
关于你当前的异常:这是因为你的所有对话都有相同的widgetVar
,并且每个对话都会覆盖先前声明的对话直到最后一个。您可以动态地为它们提供不同的窗口小部件名称,如widgetVar="deleteDlg_#{someIndex}"
,但如果您只能在打开之前只有一个可重用的对话框,其内容已更新,则没有任何意义。