在删除 p:dataTable 条目之前显示确认对话框

Show confirmation dialog before deleting a p:dataTable entry

我目前正在实施一个数据 table,其中包含主要面孔的删除功能。在删除之前,用户在对话框中确认他的决定:如果是“是”,则应删除“当前”行(也就是用户单击删除按钮的行)。目前,最后一行被删除,与触发的行删除操作无关table:

<p:dataTable var="var" value="#{bean.list}">

//some columns

//relevant column
 <p:column id="id">

  <p:commandButton id="deleteButton" onclick="PF('deleteDialog').show();" />
                            
  <p:confirmDialog id="deleteDialogId" widgetVar="deleteDialog" appendTo="@form">
    <p:commandButton id="confirm" onclick="PF('deleteDialog').hide();" 
      actionListener="#{bean.deleteRowAction(var)}" />
    <p:commandButton id="cancel" onclick="PF('deleteDialog').hide();" />
   </p:confirmDialog>
 </p:column>

</p:dataTable>

似乎 confirm 按钮的 actionListener 仅通过将 var 作为输入无法访问当前行。如果我去掉对话框并在 deleteButton 上触发动作侦听器,一切都会按预期进行:

// works, but no dialog
<p:dataTable var="var" value="#{bean.list}">

//some columns

//relevant column
 <p:column id="id">

  <p:commandButton id="deleteButton" actionListener="#{bean.deleteRowAction(var)}" />

 </p:column>

</p:dataTable>

我找到了 How can I pass selected row to commandLink inside dataTable or ui:repeat? as well as JSF Delete entity on DataTable with p:dialog,但遗憾的是没有用。

有没有办法以某种方式将“当前”table 条目传递到外部按钮?

有一种更简单的方法可以做到这一点,即使用 p:confirmDialog。这使您只需将 p:confirm 添加到 p:commandButton 即可:

<h:form>     
    <p:dataTable var="var" value="#{bean.list}">
        <p:column id="id">
             <p:commandButton id="deleteButton"
                              action="#{bean.deleteRowAction(var)}">
                 <p:confirm header="Confirmation"
                            message="Are you sure?"
                            icon="pi pi-exclamation-triangle" />
            </p:commandButton>
        </p:column>
    </p:dataTable>
     
    <p:confirmDialog global="true">
        <p:commandButton value="Yes" type="button"
                         styleClass="ui-confirmdialog-yes" icon="pi pi-check" />
        <p:commandButton value="No" type="button"
                         styleClass="ui-confirmdialog-no" icon="pi pi-times" />
    </p:confirmDialog>      
</h:form>

我只是在列中使用确认:

<p:dataTable var="item" ...
    <p:column headerText="Item">
        <p:commandButton action="#{myBean.deleteItem(item)}">
            <p:confirm header="Confirmation" message="Delete item?" icon="ui-icon-alert"/>
        </p:commandButton>
    </p:column>