2013-09-04 8 views
6

मुझे एक टेक्स्ट बॉक्स में परिवर्तन पर एक AJAX अद्यतन ट्रिगर करने की आवश्यकता है, जो <p:autoComplete> घटक है। मैंने देखा है कि यदि उपयोगकर्ता मैन्युअल रूप से टेक्स्ट टाइप करना चुनता है, तो ईवेंट एक बदलाव होता है, जबकि यदि उपयोगकर्ता स्वत: पूर्ण के लिए सुझावों में से एक पर क्लिक करता है, तो ईवेंट आइटम चयन करें। इसलिए मैंने दो <p:ajax> बच्चों को इनपुट में जोड़ा, प्रत्येक एक ही विधि को बुला रहा है और एक ही अद्यतन सूची है, लेकिन event="change" और अन्य event="itemSelect" है।प्राइमफेस स्वत: पूर्ण: आइटम बनाम परिवर्तन घटनाओं का चयन करें

हालांकि, अब मुझे कुछ अजीब पता चलता है। उदाहरण के लिए, सामान्य सर्वर मोड में रहते हुए मैंने अपना पेज खोला और "12" टाइप किया। स्वत: पूर्ण सुझाव "1233" और "1234" सुझाव के रूप में। मैंने "1233" पर क्लिक किया और प्रतीत होता है कि कुछ भी नहीं हुआ। मैंने फिर से क्लिक किया और बाकी सब कुछ भर दिया।

इवेंट हैंडलर पर ब्रेकपॉइंट के साथ डीबगर में इसे दोहराएं, और मैं देख सकता हूं कि पहले क्लिक के बाद, मान "12" है और दूसरे क्लिक पर, यह बन जाता है "1233"।

दो अलग-अलग <p:ajax> पर टिप्पणी करके स्विच करके मैं विभिन्न परिणामों को देख सकता हूं। "परिवर्तन" के बिना, हैंडलर को कभी भी बुलाया नहीं जाता है यदि उपयोगकर्ता स्वत: पूर्ण सुझाव का चयन करता है, और "आइटम चयन" के बिना, उपयोगकर्ता को मैन्युअल रूप से टाइप करने पर हैंडलर को कभी नहीं कहा जाता है। लेकिन दोनों के साथ, दो कॉल हैं, और मुझे यकीन है कि डबल-क्लिक के बारे में शिकायतें होंगी।

उन लोगों के लिए कुछ छद्म कोड है कि पसंद है, पहले एक्सएचटीएमएल:

<p:autoComplete id="itemId" value="#{myBacker.myBean.itemNumber}" 
    required="true" completeMethod="#{myBacker.idAutoComplete}"> 
    <p:ajax event="itemSelect" update="beanDetails" 
     listener="#{myBacker.idChangeEventListener()}" /> 
    <p:ajax event="change" update="beanDetails" 
     listener="#{myBacker.idChangeEventListener()}" /> 
</p:autoComplete> 
<h:panelGroup id="beanDetails"> 
    <h:panelGroup rendered="#{not empty myBacker.myBean.institutionName}"> 
     <h:outputText value="#{myBacker.myBean.institutionName}" /> 
     <!-- Continues with address, phone, etc.. --> 
    </h:panelGroup> 
</h:panelGroup> 

फिर जावा समर्थन सेम कोड:

public void idChangeEventListener() { 
    myBean = myDAO.getDetails(myBean); 
    // another couple of init-type method calls 
} 

उत्तर

9

पैरेंट टैग एक widgetVar विशेषता दें, तो इस छोटे से जोड़ने <p:ajax event="change" ...> के लिए विशेषता बच्चे टैग:

onstart="if(widgetVarName.panel.is(':visible')) return false;" 

जब प्रश्न लिखा गया था, हम चालू थे प्राइमफेस संस्करण 3.5, अगर मुझे सही याद है। तब से, हमें समाधान को अपडेट करने की आवश्यकता है:

onstart="if(PF('widgetVarName').panel.is(':visible')) return false;" 

परिवर्तन को इंगित करने के लिए माल्टर के लिए धन्यवाद।

+2

नए प्राइमफेस संस्करणों का उपयोग करते समय यह 'ऑनस्टार्ट = "होना चाहिए (पीएफ (' विजेट वारनाम ')। पैनल.आईएस (': दृश्यमान ')) झूठी वापसी;" ' – mwalter

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