2013-03-06 11 views
7

प्राइमफेस 3.5, मोज़रा 2.1.14। यह मेरा पीएफ datatable है यह एक गैर संपादन योग्य बूलियन स्तंभ 'स्वचालित' नाम से संपादन योग्य 'लेबल' कॉलम होते हैं, और,:,प्राइमफ़ेस में विशिष्ट पंक्ति को अद्यतन करने के लिए दिनांक

public void onEditLabel(CellEditEvent event) { 
    Object oldValue = event.getOldValue(); 
    Object newValue = event.getNewValue(); 

    if(newValue != null && !newValue.equals(oldValue)) { 
     DataTable s = (DataTable) event.getSource(); 
     MyEntity d = (MyEntity) s.getRowData(); 
     try { 
      d.setAutomatic(false); 
      myDAO.save(d); 
      addMessage("Change saved!"); 
     } catch (Exception ex) { 
      addErrorMessage("Label could not be saved!"); 
      getFacesContext().validationFailed(); 
     } 
    } 
} 

सेल संपादक काम करता है:

<p:dataTable value="#{bean.contents}" paginator="true" var="row" 
    editable="true" editMode="cell" rows="25" rowsPerPageTemplate="10,25,50" id="list"> 
    <p:column> 
     <f:facet name="header"><h:outputText value="header1" /></f:facet> 
     <p:selectBooleanCheckbox value="#{row.automatic}" disabled="true" id="isAutomatic"></p:selectBooleanCheckbox> 
    </p:column> 
    <p:column> 
     <f:facet name="header"><h:outputText value="header2" /></f:facet> 
     <p:cellEditor> 
      <f:facet name="output"> 
       <h:outputText value="#{row.label}"></h:outputText> 
      </f:facet> 
      <f:facet name="input"> 
       <p:inputText value="#{row.label}"></p:inputText> 
      </f:facet> 
     </p:cellEditor> 
    </p:column> 
    <p:ajax event="cellEdit" process="@this" listener="#{myBean.onEditLabel}" update="isAutomatic"/> 
</p:dataTable> 

सेल संपादित घटना श्रोता श्रोता को डेटा भेजता है, और यह डेटाबेस के लिए सही ढंग से जारी है। सेल स्वचालित ईवेंट श्रोता द्वारा 'स्वचालित' ध्वज भी साफ़ किया जाता है, और डेटाबेस के लिए सही ढंग से जारी रहता है। समस्या यह है कि क्लाइंट पर 'स्वचालित' चेकबॉक्स अपडेट नहीं किया गया है।

मैं भी

<p:ajax event="cellEdit" process="@this" listener="#{myBean.onEditLabel}" update="list"/> 

जो सही ढंग से चेकबॉक्स अद्यतन करने की कोशिश की, लेकिन यह भी कारण बनता है फोकस खो दिया है, और कचरे बैंडविड्थ।

सेल एडिट ईवेंट निकाल दिए जाने के बाद मैं केवल एक विशिष्ट सेल को कैसे अपडेट कर सकता हूं?

उत्तर

5

आप p:ajax टैग कुछ विशिष्ट पंक्ति या कॉलम में p:dataTable के अंदर है, इसलिए आप कुछ सापेक्ष घटक आईडी को इतना आसान अपडेट करते हैं। आप सेल में RequestContext अद्यतन विशिष्ट घटक की मदद से कर सकते हैं। तो, p:ajax से update को हटा दें और अपने onEditLabel विधि से जोड़ें:

RequestContext.getCurrentInstance().update(
    s.getClientId(FacesContext.getCurrentInstance()) + 
    ":" + event.getRowIndex() + 
    ":isAutomatic" 
); 

आप देख सकते हैं, सेल के अंदर घटक के आईडी आईडी आप सौंपा से पहले पंक्ति संख्या है।

+0

धन्यवाद! यह काम करता है, लेकिन निश्चित रूप से सबसे अच्छा अभ्यास नहीं है। सबसे पहले, मैं विशेष घटक आईडी नामकरण सम्मेलन पर भरोसा कर रहा हूं। दूसरा, मेरे नियंत्रक बीन में अब फ्रंटेंड तर्क (आईडी देखें) शामिल है। पीएफ डेटाटेबल में ऐसी सुविधा जोड़ने का सबसे अच्छा समाधान होगा। आह। :) – rootkit

+1

मैं पूरी तरह से आपसे सहमत नहीं हूं। बैकिंग बीन कड़ाई से प्रस्तुति परत के साथ मिलकर है (उदाहरण के लिए आप AJAX श्रोता कॉल बैकिंग बीन विधि से)। यदि आप बीन का समर्थन करने में व्यवसाय तर्क डालते हैं तो यह बुरा होगा। मैं मानता हूं कि बैकिंग बीन में आईडी डालना बहुत अच्छा नहीं है, लेकिन इस पल में मुझे कोई आसान समाधान नहीं दिख रहा है। – partlov

+0

मैं मानता हूं कि कोई आसान समाधान नहीं है, इसे करना होगा। एक बार फिर धन्यवाद! – rootkit

2

मेरा मानना ​​है कि आप उस घटक की आईडी के ब्योरे के बारे में जाने बिना इसे हल कर सकते हैं जिसे आप अपडेट करना चाहते हैं। आप इसे बीन के पैरामीटर के रूप में पास कर सकते हैं।

सबसे पहले, उस घटक को बाध्य करें जिसे आप अपडेट करना चाहते हैं। आपको वास्तव में एक बीन की आवश्यकता नहीं है जिसके लिए यह घटक बाध्य है। आपको बस अपने जेएसएफ में इस घटक की पहचान करने के लिए उपयोग करने के लिए कुछ मूल्य परिभाषित करने की आवश्यकता है। तो आपके मामले में, आप कुछ ऐसा करेंगे:

<p:selectBooleanCheckbox binding="#{isAutomaticComponent}" value="#{row.automatic}" disabled="true" id="isAutomatic"></p:selectBooleanCheckbox> 

अब जब आप अपना अपडेट करते हैं तो घटक तक पहुंचें। यानी:

<p:ajax event="cellEdit" process="@this" listener="#{myBean.onEditLabel(isAutomaticComponent.clientId)}" /> 

अब आप आईडी की सामग्री को जानने के बिना अपने सेल एडिट ईवेंट विधि से घटक अपडेट कर सकते हैं। यानी:

public void onEditLabel(CellEditEvent event, String idOfComponentToUpdate) { 
... 
RequestContext.getCurrentInstance().update(idOfComponentToUpdate); 
... 
+0

क्या आपने वास्तव में यह कोशिश की है? मुझे आश्चर्य है कि घटक बाध्यकारी एक डेटाटेबल के अंदर सही ढंग से काम करेगा। मुझे विश्वास है कि आप # {घटक.clientId} जैसे कुछ का उपयोग कर सकते हैं, http: // stackoverflow देखें।कॉम/प्रश्न/4469 992/कैसे-प्राप्त-प्राप्त-आईडी-ऑफ-कॉलिंग-घटक-इन-द-गेटर-विधि – rootkit

+0

मेरी स्थिति थोड़ा अलग है, इसलिए मैंने इस परिदृश्य को बिल्कुल सही नहीं किया है, लेकिन मैंने कुछ किया है मिलता जुलता। मेरा मानना ​​है कि यह यहां पोस्ट किए गए परिदृश्य के लिए काम करेगा। और हाँ। घटक बाध्यकारी एक डेटाटेबल के अंदर काम करता है। यह वास्तव में मेरे परिदृश्य के करीब है क्योंकि मैं किसी तालिका की पंक्ति के भीतर एक बटन की आईडी अपडेट करना चाहता था, लेकिन तालिका में पंक्तियों गतिशील होने के बाद से इसे करने में परेशानी थी और इस प्रकार बटन की आईडी थी। इस फैशन में घटक की आईडी पास करना सबसे अच्छा समाधान था जो मुझे मिल सकता था। –

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