2014-07-22 61 views
0

我有presnt產品列表的數據表:Primefaces數據表和按鈕調用的問題,

 <p:dataTable var="product" value="#{myModel.products}" 
      scrollable="true" id="productsTableId" liveResize="true" 
      resizableColumns="true"> 

      <f:facet name="header"> 
       List of products 
      </f:facet> 
      <p:column headerText="Id" sortBy="id"> 
       <h:outputText value="#{product.id}" > 
       </h:outputText> 
      </p:column> 

      <p:column headerText="Name" sortBy="name"> 
       <h:outputText value="#{product.name}" title="#{product.name}" /> 
      </p:column> 

      <p:column headerText="Remove product"> 
       <p:commandButton icon="ui-icon-close" title="delete product" 
        value="Disconnect" 
        action="#{controller.delete(product)}" 
        update="productTableId"> 
        <p:confirm header="Confirmation" 
         message="Are you sure you want to delete this product" 
         icon="ui-icon-alert" /> 
       </p:commandButton> 
      </p:column> 
</p:dataTable> 

但問題是當我嘗試排序的數據表,該行改變他們的diplay訂單,但按鍵的功能保持最初的順序,即如果我兩款產品,例如:按名稱排序後

Id  Name  Remove product 

1   B   Delete B 
2   A   Delete A 

Id  Name  Remove product 

2   A  Delete A 
1   B  Delete B 

如果我點擊「刪除A」的產品B被刪除,這是PrimeFaces還是我的錯誤錯過了一些東西。

我在jetty-9.1.2上使用PrimeFaces 4.0,JSF Mojarra 2.1.20。

+0

我認爲你需要重寫產品實體 –

+0

上的hashCode()和equals()它已經完成,但沒辦法。 – Mifmif

回答

0

我發現的問題的來源,豆myModel被設定爲請求範圍,我已經改變它查看範圍

說明

當我們加載頁面的第一次一個託管bean myModel創建和使用,當我們對數據進行排序,創建第二託管bean,當我們點擊刪除按鈕,我們問服務器刪除必須索引按下按鈕順序的產品,服務器首先嚐試創建託管bean myModel的實例,然後它會查找已發佈索引順序的產品並將其刪除。這個塞納里奧導致這個問題。爲了避免這種情況,我們使用視圖範圍繼續使用頁面加載時創建的myModel的sapce實例。在視圖範圍內,只有一個實例將在此處指定的同一個參數中創建和使用。