2013-07-05 4 views
5

मेरे पास दो पंक्तियों के साथ एक डेटा तालिका है और मेरे पास एक कॉलम है जहां मेरे पास एक साधारण बटन वाला एक फॉर्म है जो उस पंक्ति में ऑब्जेक्ट को हटा देता है।प्राइमफ़ेस डेटा तालिका में ऑब्जेक्ट के लिए डिलीट बटन कैसे डालें?

तो पहला काम कर संस्करण:

<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 में दिखाया गया है, तो हटाएं बटन केवल दूसरे मामले में पहली पंक्ति के लिए और केवल पहली बार काम करता है। जब मैं अन्य पंक्तियों के लिए "हटाएं" बटन पर क्लिक करता हूं, तो कुछ भी नहीं होता है। कारण क्या हो सकता है? DataTable कड़ी में देखा है और ज की तरह सब कुछ की जगह के रूप में: पी DataTable: DataTable और पी: स्तंभ आदि ...

+0

आपके बैकिंग बीन का क्या दायरा है? – Sonic

+0

@ सोनिक हैलो, इसमें RequestScoped है। –

+0

अपने फॉर्म को डेटाटेबल के बाहर ले जाएं। – 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> 

और प्रबंधित सेम में विधि:

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

आशा है कि यह मदद करता है।

+0

लेकिन यह अजाक्स का उपयोग कर रहा है, है ना? मैं अजाक्स का उपयोग नहीं करना चाहता। –

+1

यदि आप AJAX का उपयोग नहीं करना चाहते हैं तो आपको डिलीट कमांड बटन पर AJAX = "false" विशेषता जोड़ने की आवश्यकता है। फिर अद्यतन विशेषता को हटा दें। पीएस .: अपने प्रबंधित बीन के दायरे पर विचार करें। मुझे जवाब संपादित करने दें ताकि यह AJAX का उपयोग न करे। – theCowboy

+0

अब यह गैर-अजाक्स है। आशा करता हूँ की ये काम करेगा। – theCowboy

1

निम्नलिखित कोड आपकी मदद कर सकता है।

आपका एक्सएचटीएमएल कोड इस

<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> 

आप सेम फ़ाइल में एक DataTable चर जोड़ने के लिए

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

यह एक जेएसएफ 1.2 समाधान है। जेएसएफ 2 से, आप एक्शन प्रबंधित बीन विधि के लिए तर्क पारित कर सकते हैं और अपने कोड का लाभ उठा सकते हैं। –

+1

हाँ मुझे पता है @ लुइगी मैन्डोज़ा, बस मैं श्री कोरय तुगय को सरल सुझाव दे रहा था। –

+2

जेएसएफ 2 जेएसएफ 1 पर एक बड़ा कदम है।2, इसलिए जेएसएफ 2 समस्याओं के लिए जेएसएफ 1.2 के आधार पर उत्तर देना सही नहीं है। –

संबंधित मुद्दे