2013-07-05 41 views
5

我有一個數據表與幾行,我有一個列,我有一個窗體與一個簡單的按鈕,刪除該行中的對象。如何在Primefaces數據表中添加對象的刪除按鈕?

所以第一工作版本:

<h:dataTable value="#{actorTableBackingBean.allActors}" 
    var="actor" styleClass="table table-bordered"> 

    <h:column headerText="Actor Name" sortBy="#{actor.firstName}"> 
     <h:outputText value="#{actor.firstName}"/> 
    </h:column> 

    <h:column headerText="Actor Detail"> 
     <h:form> 
      <h:commandButton value="Delete Actor" 
       styleClass="btn btn-primary" 
       action="#{actorTableBackingBean.deleteActor(actor.actorId)}"/> 
     </h:form> 
    </h:column> 
</h:dataTable> 

而這正是deleteActor方法是這樣的:

public String deleteActor(String id){ 
    removeActorWithId(id); 
    return "/allActors.xhtml"; 
} 

private void removeActorWithId(String id){ 
    int idk = Integer.parseInt(id); 
    for(Actor a:allActors){ 
     if(a.getActorId() == idk){ 
      allActors.remove(a); 
      return; 
     } 
    } 
} 

所以這正是按預期工作,因爲它是。

但是,當我使用here中所示的Primefaces的分頁數據表時,刪除按鈕僅適用於第二種情況下的第一行,並且僅適用於第一次。 當我點擊按鈕「刪除」其他行時,根本沒有任何反應。 可能是什麼原因?

對於第二種情況只是把<形式>各地p標籤:dataTable中所看到的鏈接,並取代一切都像H:DataTable添加到號碼:DataTable,並將號碼:列等等

+0

你的支持Bean有什麼範圍? – Sonic

+0

@Sonic你好,它有RequestScoped。 –

+0

將您的表單移動到dataTable之外。 – 8bitjunkie

回答

15

我會建議你使表單標籤包含你的數據表。 這工作:

<h:form id="actorsTableForm"> 
      <p:dataTable id="actorsTable" var="item" 
       value="#{actorsMB.actorList}" selectionMode="single" 
       rowKey="#{item.description}" paginator="true" rows="10" 
       paginatorTemplate="{CurrentPageReport} {FirstPageLink} {PreviousPageLink} {PageLinks} {NextPageLink} {LastPageLink} {RowsPerPageDropdown}" 
       rowsPerPageTemplate="5,10,15" paginatorPosition="bottom"> 
       <p:column headerText="Actor Id" > 
        <h:outputText value="#{item.id}" /> 
       </p:column> 
       <p:column headerText="Actor Description"> 
        <h:outputText value="#{item.description}" /> 
       </p:column> 
       <p:column> 
        <p:commandButton icon="ui-icon-trash" 
         title="Delete this actor" 
         actionListener="#{actorsMB.remove(item)}" 
         ajax="false" /> 
       </p:column> 
      </p:dataTable> 
</h:form> 

而在託管bean的方法:

public void remove(Actor actor) { 
    try { 
     actorService.remove(actor); 
     actorList = actorService.searchAll(); 
    } catch (Exception e) { 
     e.printStackTrace(); 
    } 
} 

希望它能幫助。

+0

但是,這是使用Ajax,對吧?我不想使用Ajax。 –

+1

如果您不想使用ajax,則需要將ajax =「false」屬性添加到delete commandButton。然後刪除更新屬性。 P.S .:考慮您的ManagedBean的範圍。讓我編輯答案,以便它不使用ajax。 – theCowboy

+0

現在它是非Ajax。希望能幫助到你。 – theCowboy

1

以下代碼可能對您有所幫助。

你的XHTML代碼應該是這樣的

<h:form> 
     <h:dataTable value="#{actorTableBackingBean.allActors}" 
      binding="#{actorTableBackingBean.dataTable}" 
      var="actor" styleClass="table table-bordered"> 

      <h:column headerText="Actor Name" sortBy="#{actor.firstName}"> 
       <h:outputText value="#{actor.firstName}"/> 
      </h:column> 

      <h:column headerText="Actor Detail"> 
       <h:commandButton value="Delete Actor" 
         styleClass="btn btn-primary" 
         action="#{actorTableBackingBean.deleteActor}"/> 

       </h:column> 
     </h:dataTable> 
    </h:form> 

你必須在Bean文件添加一個數據表變量

private javax.faces.component.html.HtmlDataTable dataTable; 

public HtmlDataTable getDataTable() { 
    return dataTable; 
} 

public void setDataTable(HtmlDataTable dataTable) { 
    this.dataTable = dataTable; 
} 

delete方法應該是這樣的

public String deleteActor(){ 
    Actor model = (Actor) dataTable.getRowData(); 
    removeActorWithId(model); 
    return "/allActors.xhtml"; 
} 

private void removeActorWithId(Actor model){ 
    if(model!=null){ 
     allActors.remove(model); 
    } 
} 
+0

這是一個JSF 1.2解決方案。從JSF 2開始,您可以將參數傳遞給操作託管bean方法並利用您的代碼。 –

+1

是的,我知道@LuiggiMendoza,只是我給簡單的建議先生 科拉圖加。 –

+2

JSF 2是JSF 1的一大步。2,所以根據JSF 1.2爲JSF 2提供答案是不對的。 –

相關問題