2011-12-06 12 views
12

पीएफ 3.0-आरसी 1 स्नैपशॉट (11/22/2011)मैं प्राइमफेस कैसे प्राप्त करूं <p: selectOneMenu> valueChangeListener को कॉल करने के लिए?

का उपयोग करना मेरे पास एक समग्र घटक है। जब कोई चयन किया जाता है तो मैं valueChangeListener को कॉल करना चाहता हूं, लेकिन यह श्रोता को कॉल नहीं कर रहा है।

<p:selectOneMenu style="width: 220px;" 
     value="#{customerProfileSessionBean.selectedAccount}" 
     valueChangeListener="#{customerProfileSessionBean.accountValueChange}" > 
    <f:selectItems value="#{sessionBean1.custAccountList}"/> 
</p:selectOneMenu> 

समर्थन सेम में श्रोता एक प्रिंट बयान है कि कहा जाता है नहीं किया जा रहा (कम से कम मैं सर्वर लॉग में यह दिखाई नहीं देता है):

यहाँ घटक के लिए कोड है।

क्या कोई और चीज है जो मुझे मूल्य बदलने के लिए करने की ज़रूरत है चेंजलिस्टर को मूल्य बदलने पर बुलाया जाना चाहिए? क्या मुझे उपयोग करने की ज़रूरत है?

इसके अलावा, श्रोता में, क्या एक वैल्यू चेंजइवेंट पास हो गया है?

धन्यवाद।

उत्तर

34

आपको उम्मीद है कि सर्वर पक्ष में valueChangeListener विधि क्लाइंट पक्ष पर एक परिवर्तन घटना होने पर तुरंत कॉल की जाती है। यह सही नहीं है। यह केवल तब लागू किया जाएगा जब फॉर्म सर्वर पर सबमिट किया गया है और नया मान equals() पुराना मान नहीं है।

आपके कार्यात्मक आवश्यकता को प्राप्त करने के लिए कम से कम दो तरीके हैं:

  1. onchange="submit()" जोड़ें ताकि जब भी आप मान बदलने कि जावास्क्रिप्ट प्रपत्र प्रस्तुत करेगा:

    <p:selectOneMenu style="width: 220px;" 
        value="#{customerProfileSessionBean.selectedAccount}" 
        valueChangeListener="#{customerProfileSessionBean.accountValueChange}" 
        onchange="submit()"> 
        <f:selectItems value="#{sessionBean1.custAccountList}"/> 
    </p:selectOneMenu> 
    

    हालांकि यह बहुत है JSF -1.एक्स-आईएसएच और उपयोगकर्ता अनुभव के लिए गरीब। यह अन्य सभी इनपुट फ़ील्ड भी सबमिट करेगा (और रूपांतरित/मान्य!) जो आप चाहते हैं कि हो सकता है।

  2. इसके बजाय एक अजाक्स श्रोता का उपयोग करें, निश्चित रूप से यदि आप वास्तविक मूल्य परिवर्तन में रुचि नहीं रखते हैं (यानी पुराना मान आपके लिए दिलचस्प नहीं है), लेकिन आप वास्तव में परिवर्तन ईवेंट में रुचि रखते हैं। आप इस का उपयोग कर <f:ajax> या PrimeFaces घटकों में <p:ajax> उपयोग कर सकते हैं:

    <p:selectOneMenu style="width: 220px;" 
        value="#{customerProfileSessionBean.selectedAccount}"> 
        <p:ajax listener="#{customerProfileSessionBean.accountValueChange}" /> 
        <f:selectItems value="#{sessionBean1.custAccountList}"/> 
    </p:selectOneMenu> 
    

    और AjaxBehaviorEvent तर्क द्वारा ValueChangeEvent तर्क की जगह।

+0

धन्यवाद। मैं घटक के AJAX व्यवहार के हिस्से के रूप में सबमिट() करने के लिए प्राइमफेस घटक का एक्सप्लोर कर रहा था। – Burferd

+6

आपका सेल्कोन्ड समाधान बहुत अच्छा काम करता है, लेकिन केवल तभी मैंने devsnd

+1

बलुससी स्पॉट पर है। और भी मजेदार है, हालांकि मुझे यकीन नहीं है कि यह वैध है या नहीं, मेनू के अंदर डालने के लिए और मेन्यू के मूल्य चेंजलिस्टर विशेषता को छोड़ दें। किसी कारण से AJAX मूल्य बदलता है जब आइटम बदलता है ChangeEvent। मैंने लोकल में तत्काल परिवर्तन करने के लिए इसे पूरी तरह से परीक्षण किया है और यह एक सपना काम करता है। –

3

जोड़ें च: पी के लिए ajax बयान: selectOneMenu, यह ajax कॉल बनाएगा और आपके मूल्य प्रस्तुत किया जाएगा पूर्व:

 <p:selectOneMenu style="width: 220px;" value="# 
     {customerProfileSessionBean.selectedAccount}" 
      valueChangeListener="#{customerProfileSessionBean.accountValueChange}" > 
     <f:selectItems value="#{sessionBean1.custAccountList}"/> 
     <f:ajax render="@form"/> 
     </p:selectOneMenu> 

या आप, पैनल आईडी या datatable आईडी प्रदान कर सकते हैं अगर आप न पूरे फॉर्म को प्रस्तुत करना चाहते हैं, जैसे:

<f:ajax render=":formid:panelGroupId"/> 
संबंधित मुद्दे

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