2012-06-18 11 views
5

मेरे पास एच है: पंक्तियों की एक सूची दिखाते हुए डेटाटेबल, और प्रत्येक पंक्ति के फ़ील्ड इनपुट फ़ील्ड हैं।जेएसएफ डेटाटेबल: पंक्तियों को जोड़ना और निकालना स्पष्ट पंक्ति मान

मैं मेज से पहले एक "पंक्ति जोड़ें" बटन प्रस्तुत करना है, और तालिका की प्रत्येक पंक्ति पर एक "पंक्ति निकालें" बटन।

पाक सेम viewScoped है, और बटन जोड़ने/समर्थन सेम में जावा सूची से तत्वों को दूर, और फिर एक ही दृश्य पर लौटने।

मैं आदेश इनपुट फ़ील्ड मान्य नहीं करने के लिए जब मैं जोड़ने या निकालने के एक पंक्ति में तत्काल विशेषता को "सही" बटन में निर्धारित किया है।

सब कुछ काम करता है ठीक है, लेकिन एक बात: इनपुट फ़ील्ड के मूल्यों को मंजूरी दे दी जाती है। मैंने सोचा था कि विचारों ने बीन को मूल्यों को ध्यान में रखा है देखा गया है।

मैं जोड़ने/सत्यापन ट्रिगर और मूल्यों कि पहले से ही के रूप में उपयोगकर्ता द्वारा टाइप किए गए थे रखने के बिना पंक्तियों को हटाने के लिए कैसे प्राप्त कर सकते हैं?

मेरा विचार:

<h:form> 
    <h:commandButton value="Añadir Fila" immediate="true" action="#{tablaController.addRowAction}" /> 
    <h:dataTable value="#{tablaController.lista}" var="fila" cellpadding="0" cellspacing="0" border="1"> 
     <f:facet name="header">TABLA</f:facet> 
     <h:column> 
      <f:facet name="header"><h:outputLabel value="NOMBRE" /></f:facet> 
      <h:inputText id="nom" value="#{fila.nombre}" /> 
      <h:message for="nom" class="msjError" /> 
     </h:column> 
     <h:column> 
      <f:facet name="header"></f:facet> 
      <h:commandButton value="Quitar Fila" immediate="true" action="#{tablaController.removeRowAction(fila)}" /> 
     </h:column> 
    </h:dataTable> 
</h:form> 

मेरे समर्थन सेम:

@ManagedBean(name="tablaController") 
@ViewScoped 
public class TablaController { 

private List<Fila> lista; 
... 
public TablaController() { } 
... 
@PostConstruct 
public void init() { 
    this.lista = new ArrayList<Fila>(); 
    for (int i=0; i<5; i++) { 
     Fila fila = new Fila(); 
     fila.setNombre(""); 
     this.lista.add(i,fila); 
    } 
} 
... 
public String addRowAction() { 
    Fila fila = new Fila(); 
    fila.setNombre(""); 
    this.lista.add(fila); 
    return ""; 
} 

public String removeRowAction (Fila f) { 
    boolean exito = this.lista.remove(f); 
    return ""; 
} 
... 
} 

अद्यतन -> मेरी समाधान:

मैं यहाँ मेरी समाधान बारे में अगर किसी को दिलचस्पी है।

समस्या यह है कि मैं सत्यापन को छोड़ने के लिए तत्काल = "सत्य" का उपयोग करता हूं, लेकिन यह update_model_values ​​को भी छोड़ देता है, ताकि फॉर्म में उपयोगकर्ता द्वारा दर्ज किए गए मान जोड़े/निकालें बटन पर क्लिक करने के बाद खो जाए पृष्ठ को प्रस्तुत करना

जैसा कि मैं "जेएसआर -303 बीन सत्यापन" का उपयोग करता हूं, मेरा समाधान f: validateBean का उपयोग करके सत्यापन को छोड़ना था/उन्हें अक्षम करने के लिए। बटन पर निर्भर करता है, यदि मैं सत्यापन निष्पादित करना चाहता हूं, तो मैं बीन सत्यापन सक्षम करता हूं (उदाहरण के लिए "सबमिट" बटन में), और यदि मैं उन्हें छोड़ना चाहता हूं, तो मैं बीन सत्यापन अक्षम करता हूं (जैसे जोड़ने/निकालने में पंक्ति बटन)। लेकिन वैसे भी update_model_values ​​हमेशा निष्पादित होते हैं, इसलिए मान गुम नहीं होते हैं।

<h:form> 
    <f:validateBean disabled="#{!empty param['disableValidation']}"> 
     <h:commandButton value="Añadir Fila" action="#{tablaController.addRowAction}"> 
      <f:param name="disableValidation" value="true" /> 
     </h:commandButton> 
     <h:dataTable value="#{tablaController.lista}" var="fila" cellpadding="0" cellspacing="0" border="1"> 
      <f:facet name="header">TABLA</f:facet> 
      <h:column> 
       <f:facet name="header"><h:outputLabel value="NOMBRE" /></f:facet> 
       <h:inputText id="nom" value="#{fila.nombre}" /> 
       <h:message for="nom" class="msjError" /> 
      </h:column> 
      <h:column> 
       <f:facet name="header"></f:facet> 
       <h:commandButton value="Quitar Fila" action="#{tablaController.removeRowAction(fila)}"> 
        <f:param name="disableValidation" value="true" /> 
       </h:commandButton> 
      </h:column> 
     </h:dataTable> 
     <h:commandButton value="Submit" action="#{tablaController.saveData}" /> 
    </f:validateBean> 
</h:form> 

समर्थन सेम:

@ManagedBean(name="tablaController") 
@ViewScoped 
public class TablaController { 

private List<Fila> lista; 
... 
public TablaController() { } 
... 
@PostConstruct 
public void init() { 
    this.lista = new ArrayList<Fila>(); 
    for (int i=0; i<5; i++) { 
     Fila fila = new Fila(); 
     fila.setNombre("fila "+i); 
     this.lista.add(i,fila); 
    } 
} 
... 
public String addRowAction() { 
    Fila fila = new Fila(); 
    fila.setNombre(""); 
    this.lista.add(fila); 
    return ""; 
} 

public String removeRowAction (Fila f) { 
    this.lista.remove(f); 
    return ""; 
} 
... 
public String saveData() { 
    ... 
    //processes the valid data 
    //for example, calls to a service method to store them in a database 
    ... 
    return ""; 
} 
... 
} 
+0

हाय मुझे एक ही समस्या है, अच्छा समाधान है। लेकिन क्या आपको पता है कि अंतर्निहित मान्यताओं को कैसे अक्षम किया जाए, जैसे "आवश्यक = सत्य"? – wutzebaer

+2

आप आवश्यक = "# {खाली param ['अक्षम सत्यापन']} डाल सकते हैं"। इस प्रकार फ़ील्ड की आवश्यकता होगी या आपके द्वारा क्लिक किए गए बटन के आधार पर नहीं। यदि आप आवश्यक एट्रिब्यूट को अक्षम करना चाहते हैं तो आप "अक्षम सत्यापन" पैरा पास करते हैं। – choquero70

+2

@ choquero70 आपको अपना उत्तर अलग से पोस्ट करना चाहिए। इसे सिर्फ प्रश्न में न जोड़ें। इस तरह, एसओ उपयोगकर्ताओं के लिए इसे पार्स करना और समझना आसान होगा। –

उत्तर

0

मैं बिल्कुल वैसा ही समस्या थी

यहाँ दृश्य है। संक्षेप में, आप डेटा तालिका (यूआईडीएटी) या फेसलेट दोहराना अद्यतन करने वाली कार्रवाई के लिए तत्काल उपयोग नहीं कर सकते हैं। संक्षिप्त विवरण: प्रस्तुत मूल्यों को फिर से प्रदर्शित करने के लिए नहीं रखा जाता UIData में आदानों सत्यापन के माध्यम से जाना नहीं है। लांग विवरण यहां पाया जा सकता: long explanation और a related bug in Mojarra

2

मैं आदेश इनपुट फ़ील्ड मान्य नहीं करने के लिए जब मैं जोड़ने या निकालने के एक पंक्ति में तत्काल विशेषता को "सही" बटन में निर्धारित किया है।

immediate="true" नौकरी के लिए गलत उपकरण है। इसका उपयोग सत्यापन को प्राथमिकता देना चाहिए, सत्यापन को सक्षम/अक्षम नहीं किया जाना चाहिए।अंतर आप जितना बड़ा सामना करते हैं उतना बड़ा है।

आप सशर्त रूप से सत्यापन ट्रिगर करना चाहते हैं। उदाहरण के मामले में required="true" कि जितना आसान

<h:inputText ... required="#{saveButtonPressed}" /> 

जहां #{saveButtonPressed} का मूल्यांकन करता है true जब बचाने के बटन दबाने होगा। जैसे जब इसकी क्लाइंट आईडी अनुरोध पैरामीटर मानचित्र में मौजूद है।

JSR 303 सेम मान्यता के मामले में, कि

<f:validateBean disabled="#{not saveButtonPressed}"> 
    <h:inputText ... /> 
</f:validateBean> 

या OmniFaces <o:validateBean> जो एक प्रति आदेश के आधार पर नियंत्रित करने की अनुमति देता है कि के साथ की बात होगी।

<h:commandButton id="add" ...> 
    <o:validateBean disabled="true" /> 
</h:commandButton> 
संबंधित मुद्दे