2013-02-07 41 views
9

मैं मूल्य परिवर्तन की घटनाओं (क्योंकि valueChangeListener फार्म पर शुरू की है पेश करें) को संभालने के लिए p:ajax श्रोता उपयोग कर रहा हूँ के लिए:अजाक्स valueChangeListener

<p:ajax event="change" listener="#{bean.onNameChanged}"/> 

हैंडल विधि:

public void onNameChanged(final AjaxBehaviorEvent event) 

समस्या यह है, मैं AjaxBehaviorEvent में नहीं मिल सकता है और न ही इसकी कक्षा पदानुक्रम पुरानी मान इनपुट के पढ़ने के लिए जगह है। न तो मैं गूगल में संकेत मिल सकता है, कितने साल के मूल्य प्राप्त करने के ...

कैसे p:ajax onChange स्थिति में पुराने मूल्य तक पहुँचने के लिए?

उत्तर

15

समस्या है, मैं AjaxBehaviorEvent है और न ही अपने वर्ग पदानुक्रम में इनपुट के पुराने मूल्य को पढ़ने के लिए जगह नहीं मिल रहा। न तो मैं गूगल, कितने साल के मूल्य प्राप्त करने के लिए संकेत मिल सकता है ...

एक valueChangeListener का प्रयोग करें।


Unfortunatelly, valueChangeListener पी से पहले शुरू हो जाती है: ajax, तो मैं उस विधि में रूपों से वास्तविक डेटा की जरूरत नहीं है, इसलिए सिद्धांत रूप में मैं पुराने मूल्य याद करने के लिए valueChangeListener इस्तेमाल कर सकते हैं और उसके बाद के लिए प्रतीक्षा पी: प्रक्रिया के लिए AJAX ...

मूल्य परिवर्तन घटना को चालान चरण चरण में कतार दें।

public void valueChangeListenerMethod(ValueChangeEvent event) { 
    if (event.getPhaseId() != PhaseId.INVOKE_APPLICATION) { 
     event.setPhaseId(PhaseId.INVOKE_APPLICATION); 
     event.queue(); 
     return; 
    } 

    // Do your original job here. 
    // It will only be invoked when current phase ID is INVOKE_APPLICATION. 
} 
+4

+1, किसी को क्या करना चाहिए "BalusC कमाल है" वीडियो (जैसे वीडियो "लोग कमाल के हैं") – Daniel

+0

Bauke आप अद्भुत पुरुष कर रहे हैं: डी तुम बस मुझे खरोंच सिर के घंटे बचा लिया। – xwinus

+2

सामान्य रूप से बालससी ने मेरे पास होने से पहले मेरे लिए मेरी समस्या हल कर दी है। – Herick

3

आप निम्न की कोशिश कर सकते:

  1. अपने सेम में मूल्य परिवर्तन घटना को लागू

    public void processValueChange(ValueChangeEvent e){ 
    //foo the bar 
    } 
    
  2. अपने चयन के घटक पर एक valueChangeListener परिभाषित

    <p:selectOneMenu value="#{yourBean.value}" onchange="submit()" valueChangeListener="{#yourBean.processValueChange}"> 
    

    कुंजी टुकड़ा submit() बिट है जो मूल्य के परिवर्तन पर संलग्न फॉर्म को संसाधित करता है। इसके बाद आप getNewValue() और getOldValue() आवश्यकतानुसार कर सकते हैं।

संपादित करें: अब मैं इसके बारे में लगता है कि, मैं कोई कारण नहीं क्यों आप अपने सेटअप नहीं छोड़ सकते रूप में है और बस valueChangeListener परिभाषित देखते हैं। <p:ajax/> में change ईवेंट के दौरान इसे अभी भी संसाधित किया जाना चाहिए, वास्तव में, यह AJAX ईवेंट के लिए श्रोता के समक्ष संसाधित किया जाएगा।

दृश्य:

<h:form> 
    <h:inputText value="#{sessionBean.hello}" 
       valueChangeListener="#{sessionBean.valueChangeListener}"> 
    <p:ajax/> 
    </h:inputText> 
</h:form> 

सेम:

public void valueChangeListener(ValueChangeEvent e) { 
    System.out.println("valueChangeListener invoked:" 
         + " OLD: " + e.getOldValue() 
         + " NEW: " + e.getNewValue()); 
} 

ऊपर कोड अगर मैं "हैलो" से पाठ क्षेत्र बदलने प्रिंट होगा

+0

नहीं है, प्रस्तुत (क्योंकि मान्यता के) नहीं किया जा सकता है और परिवर्तन क्षेत्र बदलने के बाद अन्य घटकों को दिखने चाहिए, इसलिए यह एक समाधान नहीं है) –

+0

@lechlukasz: आप "EDIT" में बताए गए आंशिक सबमिट कर सकते हैं-कोलोसस उत्तर के भाग। फिर valueChangeListener का आह्वान किया जाएगा और आप पुराने और नए मान तक पहुंच सकते हैं। अन्य सभी फॉर्म तत्वों का मूल्यांकन/संसाधित नहीं किया जाएगा (जब तक आप इसे अजाक्स कॉल की 'निष्पादित' विशेषता में नहीं डालते।) –

+0

दुर्भाग्य से, valueChangeListener को पी: AJAX से पहले बुलाया जाता है, इसलिए मेरे पास फॉर्म से वास्तविक डेटा नहीं है विधि, इसलिए सिद्धांत में मैं पुराने मूल्य को याद रखने के लिए valueChangeListener का उपयोग कर सकता हूं और फिर पी: AJAX प्रक्रिया के लिए प्रतीक्षा कर सकता हूं ... –

5

ValueChangeListener इस तरह से काम करना चाहिए "दुनिया" के लिए:

valueChangeListener अनुरोध किया गया: पुराने: हैलो नई: दुनिया

+0

क्या आप जानते हैं कि सर्वर कोड में बीन परिवर्तनों को कैसे दिखाना है? पी के साथ: AJAX मेरे पास यूआई कंट्रोल की सामग्री भेजने के लिए प्रक्रिया विकल्प है, इस तरह से वे अंतिम सबमिट से राज्य में हैं ... –

+0

@lechlukasz: बलुस के जवाब पर एक नज़र डालें। –

0

आप इस का उपयोग कर सकते हैं:

public void onNameChanged(AjaxBehaviorEvent event) 
{ 
    String myVal = (String) ((UIOutput) event.getSource()).getValue(); 
    System.out.println("myVal: " + myVal); 
} 
+1

ओपी "** पुराना ** मान" में रूचि रखता है क्योंकि यह पहले * अद्यतन मॉडल मूल्य चरण हुआ था। AJAX श्रोता, हालांकि * अद्यतन मॉडल मान चरण के बाद * चलाता है। उचित दृष्टिकोण के लिए वर्तमान में स्वीकृत उत्तर देखें। – BalusC