2013-04-09 47 views
1

我有一個表格在表格中。表格中的一列顯示一排按鈕以編輯和刪除表格條目。當我刪除一個條目從按鈕的action屬性呼叫控制器時,它按預期工作。Primefaces DataTable - 用對話框刪除刪除錯誤的條目

但是,一旦我添加了一個對話框讓用戶確認刪除,就會刪除一個錯誤的條目。它始終是當前表中的最後一個條目。我不知道是什麼原因 - 我使用相同的DataTablevar作爲按鈕和對話框。

我正在使用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" /> 

回答

6

爲每一行創建一個<p:dialog>不是一個好主意。

對於初學者,您最好在<p:dataTable>之外創建單個<p:dialog>

接下來的事情,我會做的是設置ID或應刪除按鈕點擊在對話框中使用該ID或豆行VAR刪除確認的情況下,你的bean行VAR

這是您的刪除按鈕可能看起來怎麼樣,設置download VAR在prepareDataForDeletion行動,並顯示在對話框...

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

關於當前的異常:那是因爲你所有的對話框有相同的widgetVar和每個下一個覆蓋先前聲明的一直到最後一個。你可以動態地給它們一個不同的小部件名稱,比如widgetVar="deleteDlg_#{someIndex}",但是如果你只有一個可重用的對話框,其內容在打開之前被更新,這是沒有意義的。

+0

會做。感謝您的關注。你有一個想法爲什麼我的方法不工作(我知道這是一個問題的困難部分) - 我最終使用相同的變量?和WRT外部對話框,我將如何同時在我的bean上設置var並激活對話框? – kostja 2013-04-09 08:29:40

+0

完美地工作。再次感謝,丹尼爾 – kostja 2013-04-09 09:48:48

+0

不客氣。 – Daniel 2013-04-09 10:13:52