2013-10-23 4 views
28

पूर्ण होने पर पूरे को अपडेट करने पर मुझे सेल को संपादित करने के बाद प्राइमफ़ेस डेटाटेबल को दोबारा प्रस्तुत करने में कठिनाई हो रही है। एक सेल में मान बदलने से अन्य कोशिकाओं में प्रविष्टियां बदल सकती हैं, इसलिए पूरी तालिका को रीफ्रेश करने की आवश्यकता है। <p: ajax event = "cellEdit">

यहाँ JSF पेज है:

<h:form id="testForm"> 
    <p:outputPanel id="testContainer"> 

     <p:dataTable id="testTable" value="#{tableBean.data}" var="entry" editable="true" editMode="cell"> 

      <p:ajax event="cellEdit" listener="#{tableBean.onCellEdit}" update=":testForm:testContainer" /> 

      <p:column headerText="Col1"> 
       <p:cellEditor> 
        <f:facet name="output"><h:outputText value="#{entry.col1}" /></f:facet> 
        <f:facet name="input"><p:inputText value="#{entry.col1}" /></f:facet> 
       </p:cellEditor> 
      </p:column> 

      <p:column headerText="Col2"> 
       <p:cellEditor> 
        <f:facet name="output"><h:outputText value="#{entry.col2}" /></f:facet> 
        <f:facet name="input"><p:inputText value="#{entry.col2}" /></f:facet> 
       </p:cellEditor> 
      </p:column> 

     </p:dataTable> 

     <p:commandButton id="refreshButton" value="Redisplay" update="testContainer" /> 

    </p:outputPanel>          
</h:form> 

और यहाँ समर्थन सेम है:

@ManagedBean(name = "tableBean", eager = false) 
@ViewScoped 
public class TableBean { 

    public TableBean() { 
     RowData entry = new RowData("a1", "b1"); 
     entries.add(entry); 
     entry = new RowData("a2", "b2"); 
     entries.add(entry); 
     entry = new RowData("a3", "b3"); 
     entries.add(entry); 
    } 

    public class RowData { 

     private String col1; 
     private String col2; 

     public RowData(String col1, String col2) { 
      this.col1 = col1; 
      this.col2 = col2; 
     } 

     public String getCol1() { 
      return col1; 
     } 

     public void setCol1(String col1) { 
      this.col1 = col1; 
     } 

     public String getCol2() { 
      return col2; 
     } 

     public void setCol2(String col2) { 
      this.col2 = col2; 
     } 
    } 

    private ArrayList<RowData> entries = new ArrayList<RowData>(); 

    public List<RowData> getData() { 
     return entries; 
    } 

    public void onCellEdit(CellEditEvent event) { 
     entries.get(event.getRowIndex()).setCol1("Dummy Col 1"); 
     entries.get(event.getRowIndex()).setCol2("Dummy Col 2");   
    } 
} 

जब अद्यतन = सहित ": testForm: testContainer" cellEdit AJAX घटना के भीतर, एक सेल मूल्य हटाए गए बदलते स्क्रीन पर डेटाटेबल और केवल सेल सामग्री (बटन के साथ) प्रस्तुत करता है - मुझे समझ में नहीं आता कि यह क्यों है। जब अद्यतन विशेषता निर्दिष्ट नहीं होती है, तो तालिका सक्रिय सेल के साथ स्क्रीन पर बनी रहती है, लेकिन अन्य कोशिकाओं में से कोई भी अपडेट नहीं किया जाता है (जैसा कि उम्मीद की जा सकती है)।

वांछित व्यवहार AJAX सेल एडिट ईवेंट के भीतर अद्यतन विशेषता निर्दिष्ट नहीं करके और सेल के मान को संपादित करने के बाद Redisplay बटन पर क्लिक करके प्राप्त किया जा सकता है (एक गैर-स्वचालित तरीके से)। मैं इसे स्वचालित तरीके से कैसे प्राप्त कर सकता हूं, और अपडेट विशेषता क्यों काम नहीं करती है?

मैं प्राइमफ़ेस 4.0 का उपयोग कर रहा हूं।

+0

क्या आपने अद्यतन = ": testForm: testContainer" को अद्यतन = ": testForm: testTable" को बदलने का प्रयास किया है? –

+0

अभी कोशिश की है, लेकिन केवल वर्तमान सेल अपडेट हो रहा है। – Franzl

उत्तर

47

rowEdit और cellEdit घटनाओं डिजाइन के अंदर तालिका अद्यतन नहीं/वर्तमान पंक्ति से कुछ और, तब भी जब स्पष्ट रूप से update विशेषता में निर्दिष्ट नहीं फिर से प्रस्तुत करना द्वारा करता है। यह प्रतिक्रिया आकार को कम करने के लिए प्राइमफेस के थोड़ा अति उत्साही प्रयास का परिणाम है।यह ज्यादातर मामलों में समझ में आता है, लेकिन विशेष रूप से आपके मामले में नहीं। यह एक मुद्दा रिपोर्ट के लायक है।

इस बीच, जब तक वे इस व्यवहार को ठीक नहीं करते हैं, तब तक आपकी सर्वश्रेष्ठ शर्त वांछित श्रोता विधि का आह्वान करने और तालिका का पूरा अपडेट करने के लिए <p:remoteCommand> का उपयोग कर रही है।

पुनर्लेखन

<p:dataTable ...> 
    <p:ajax event="cellEdit" listener="#{tableBean.onCellEdit}" update=":testForm:testContainer" /> 
    ... 
</p:dataTable> 

<p:remoteCommand name="onCellEdit" action="#{tableBean.onCellEdit}" update="testContainer" /> 
<p:dataTable ...> 
    <p:ajax event="cellEdit" oncomplete="onCellEdit()" /> 
    ... 
</p:dataTable> 
+0

@ बाल्लूसी मैंने आपके द्वारा निर्देशित किया था लेकिन 'ग्लासफ़िश सर्वर' त्रुटि को संकेत देता है कि विधि 'नहीं है' क्योंकि यह उल्लेख करने की आवश्यकता है कि इस विधि को 'टिम लॉन्ग' के रूप में कहा गया है जिसमें 'सेलएडिटवेन्ट'param शामिल है। जब मैं एक सेल ** संपादित किया जाता है तो मैं 'संपूर्ण डेटाटेबल अपडेट करना चाहता था'। कृपया क्या आप मेरी मदद कर सकते हैं? – elgolondrino

+0

क्या किसी ने कभी भी इस मुद्दे की रिपोर्ट प्राइमफेस को दी है? हमारे पास प्राइमफेसेस प्रो है और आगे बढ़ने को तैयार होगा। –

+3

बस एक त्वरित चिल्लाओ और 'धन्यवाद'। मैने सोचा मैं पागल हो गया था। मेरे लिए, मैंने AJAX 'cellEdit' श्रोता को जगह में छोड़ दिया, और उसके बाद 'रिमोट कमांड' में 'अपडेट' विशेषता को 'रिमोट कमांड' घटक में ले जाया गया, जिसमें 'अपडेट' विशेषता को निष्पादित करने के लिए अनिवार्य रूप से उपयोग किया गया था। के लिए AJAX घटना का उपयोग कर। – Doug

0

मैंने आपके कोड का परीक्षण किया। सबसे पहले मैंने पी को स्थानांतरित किया: कमांड बटन से बाहर: आउटपुट पैनल। यहाँ संशोधित किया गया है कोड:

<h:form id="testForm"> 
      <p:outputPanel id="testContainer"> 

       <p:dataTable id="testTable" value="#{tableBean.data}" var="entry" editable="true" editMode="cell"> 

        <p:ajax event="cellEdit" listener="#{tableBean.onCellEdit}" update=":testForm:testContainer" /> 

        (...) 

       </p:dataTable> 
      </p:outputPanel> 
      <p:commandButton id="refreshButton" value="Redisplay" update="testContainer" /> 
     </h:form> 

मुझे लगता है कि इस कोड को सही ढंग से काम नहीं करता है। यदि आप तालिका में कुछ भी बदलते हैं, तो पी: AJAX हर बार पूर्ण तालिका प्रस्तुत करता है। इसलिए, प्रोग्राम टेबलबीन कन्स्ट्रक्टर से मूल डेटा लोड करता है और हटाए गए नए डेटा को लोड करता है।

basic data

अगर मैं अपने पी को छोड़ देते हैं: ajax कोड वहाँ स्क्रीन से कोई नया डेटा disapears नहीं है। refreshButton पी: कमांड बटन सही ढंग से काम करते हैं।

जब अद्यतन = सहित ": testForm: testContainer" cellEdit AJAX घटना के भीतर, एक सेल मान बदलने के लिए स्क्रीन पर datatable हट जाता है और केवल सेल सामग्री (बटन के साथ) renders - मुझे नहीं पता समझते हैं कि यह क्यों है।

मुझे लगता है कि यह बुरा डिजाइन ajax के update=":testForm:testContainer" जोड़ने के लिए, क्योंकि यह अद्यतन आपकी outputPanel (सेल पहली बार सही ढंग से काम करते हैं, दूसरी बार संपादित नहीं कर सकता है, क्योंकि कई बार मेज पर कार्यक्रम अद्यतन) अधिक exepted के रूप में की तुलना में है।

मुझे नहीं पता कि आपका लक्ष्य क्या है। यदि आप कमांड बटन के बिना टेबल प्रस्तुत करना चाहते हैं, तो क्या आप एक जावास्क्रिप्ट ईवेंट या पी: संदेश निर्दिष्ट कर सकते हैं और यह गायब हो जाता है कि आप तालिका प्रस्तुत कर सकते हैं।

मुझे लगता है कि यदि आप पी: AJAX में अद्यतन को छोड़ देते हैं या एक पी: संदेश का अद्यतन निर्दिष्ट करते हैं, और testContainer से p.command बटन हटाएं तो आपका कोड सही ढंग से काम शुरू हो जाता है।

17

को BaLusC समाधान मेरे लिए सीधे काम नहीं किया है। OnCellEdit को सेलएडिटइवेंट को सर्वो के रूप में चाहिए।

<p:remoteCommand name="onCellEdit" update="testContainer" /> 
<p:dataTable ...> 
    <p:ajax event="cellEdit" listener="#{tableBean.onCellEdit}" oncomplete="onCellEdit()" /> 
    ... 
</p:dataTable> 
+0

आप विधि काम करता है लेकिन केवल एक 'सेल' को संपादित करने के लिए? इसे कैसे ठीक करें? – elgolondrino

+0

मेरे मामले में, BaLusC समाधान इनपुट टेक्स्ट के लिए काम करता है मेरे पास एक संपादन योग्य तालिका में है, यदि एक सेल के भीतर स्वत: पूर्ण नियंत्रण में परिवर्तन किया जाता है, तो पूरी तालिका अपडेट नहीं की गई थी। रिमोट कॉमांड समाधान के साथ, यह अच्छी तरह से काम करता है। –

5

समाधान से कोई भी आप के लिए काम किया है, तो यह मेरे लिए काम किया

<p:dataTable ... id="theId" widgetVar="theWidget" ...> 
       <p:ajax event="rowEdit" listener="#{...}" 
         oncomplete="PF('theWidget').filter()"/> 
.... 

मैं ajax पर पीएफ विजेट पर फिल्टर विधि फोन कर रहा हूँ पूरा, किसी भी विधि: मेरा वैकल्पिक हल के रूप में निम्नलिखित है जो तालिका के "पुनः लोड" को काम करना चाहिए, मैंने फ़िल्टर का उपयोग किया क्योंकि मेरी तालिका में कॉलम फ़िल्टर थे।

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