2013-05-03 8 views
5

के बाद एक्शन-इवेंट पर काम नहीं करता है एकाधिक AJAX-events की अनुक्रमिक प्रसंस्करण की समर्थित जेएसएफ 2.x सुविधा मेरे लिए काम नहीं करती है। मैं इस परिदृश्य पर मिल गया:जेएसएफ AJAX ईवेंट कतार परिवर्तन-घटना

  1. ज: inputText (बदलें)

    <h:inputText id="consumption_input" 
        value="#{cc.attrs.consumptionInfo.consumption}"> 
        <f:ajax 
        render="#{cc.attrs.outerRenderString}" 
        event="change" listener="#{cc.handleAjaxRequest}" /> 
    </h:inputText> 
    
  2. ज: CommandButton (कार्रवाई)

    <h:commandButton 
        id="startComparisonButton" 
        action="#{rateComparisonBean.startRateComparison()}" 
        value="#{bundle.rateResultOverview_startComparison}"> 
        <!-- This is to avoid mixed requests, ajax and full requests --> 
         <f:ajax render="@form"/> 
        </h:commandButton> 
    

दोनों तत्वों की घटनाओं रहे हैं अगर इसे स्वयं ट्रिगर किया गया तो सही ढंग से संभाला जाता है।

समस्या तब होती है जब दोनों ईवेंट एक क्लिक के भीतर ट्रिगर होते हैं (टेक्स्ट इनपुट में एक मान दर्ज करें और बाद में बटन पर क्लिक करें)। मुझे उम्मीद है कि यह दो अजाक्स अनुरोध को सिंक्रनाइज़ेशन से हटाया जाएगा (चेंज-टेक्स्टफिल्ड और ACTION-commandButton)।

दुर्भाग्य से केवल एक अजाक्स-अनुरोध (चेंज-टेक्स्टफिल्ड) है, दूसरा कार्यक्रम पूरी तरह से खो जाता है। , CommandButton पूरा भर रहे हैं के रूप में यहाँ बताया:

मैं पहले से ही यह सुनिश्चित किया एक घंटे के लिए सभी पूर्व की स्थिति है कि commandButton/commandLink/ajax action/listener method not invoked or input value not updated

मैं कैसे इस समस्या को हल करने के लिए पर कोई संकेत प्राप्त करने के लिए आभारी होंगे।

पर्यावरण: Glassfish 3, Mojarra 2.1.3-FCS

+0

दिलचस्प ... क्या आपने इसे एक छोटे से आसानी से प्रतिलिपि किए गए एप्लिकेशन में सत्यापित किया था? क्या माईफेरा के लिए मोजरा को स्वैप करना संभव है और देखें कि क्या आपको वही व्यवहार मिलता है? –

+0

क्या आपने कभी दो (एक्शन) श्रोताओं के साथ * अपेक्षित * व्यवहार प्राप्त किया है? – skuntsel

+0

क्या आपको कोई समाधान मिला? मैं भी ऐसी ही समस्या का सामना कर रहा हूँ। –

उत्तर

3

JSF AJAX कॉल अतुल्यकालिक कर रहे हैं। एक AJAX अनुरोध भेजना, इस मामले में <h:inputText>onchange ईवेंट द्वारा उत्पन्न, जावास्क्रिप्ट को इसके निष्पादन को जारी रखने के लिए नहीं रोकता है, और इस मामले में, सबमिट बटन को ट्रिगर करें, जो इसके बदले में एक और AJAX अनुरोध को सक्रिय करता है। फिर भी, AJAX अनुरोध क्लाइंट पर वास्तव में कतारबद्ध हैं, जिन्हें उन्हें भेजे गए सटीक क्रम में संसाधित किया जा सकता है, जो JSF 2.0 specification, अध्याय 13.3.2 द्वारा गारंटीकृत है।

नीचे अपने परीक्षण मामला है:

दृश्य:

<h:form id="form"> 
    <h:inputText id="text" value="#{q16363737Bean.text1}"> 
     <f:ajax render="text2" event="change" listener="#{q16363737Bean.ajaxListenerText}"/> 
    </h:inputText> 
    <h:commandButton id="button" action="#{q16363737Bean.actionButton}" value="Submit"> 
     <f:ajax render="text1 text3" listener="#{q16363737Bean.ajaxListenerButton}"/> 
    </h:commandButton> 
    <br/> 
    <h:outputText id="text1" value="Text 1: #{q16363737Bean.text1}."/> 
    <h:outputText id="text2" value="Text 2: #{q16363737Bean.text2}."/> 
    <h:outputText id="text3" value="Text 3: #{q16363737Bean.text3}."/> 
</h:form> 

सेम: मैं वास्तव में पता लगा

@ManagedBean 
@ViewScoped 
public class Q16363737Bean implements Serializable { 

    private String text1 = "I'm text 1";//getter + setter 
    private String text2 = "I'm text 2";//getter + setter 
    private String text3 = "I'm text 3";//getter + setter 

    public void ajaxListenerText(AjaxBehaviorEvent abe) { 
     text2 = "I was modified after inputText AJAX call"; 
    } 

    public void ajaxListenerButton(AjaxBehaviorEvent abe) { 
     text1 = "I was modified after AJAX listener call of commandButton"; 
    } 

    public void actionButton() { 
     text3 = "I was modified after commandButton AJAX call"; 
    } 

} 

कुछ समय के लिए सवाल परीक्षण करने के बाद कि बहुत ही कम कमांड बटन के AJAX कॉल को निगल लिया गया था डी नो यूआई अपडेट किए गए थे। ऐसा लगता है कि कहीं कुछ दौड़ की स्थिति होनी चाहिए। यह एक अच्छा सवाल है और इसे आगे की जांच की जरूरत है।

तो, शायद यह कोई जवाब नहीं है (हालांकि मैंने सोचा कि यह शुरुआत में होगा), लेकिन एक परीक्षण मामले के लिए प्रस्ताव। और इस तथ्य के बावजूद कि मुझे इस व्यवहार का बहुत कम सामना करना पड़ा, यह वास्तविक उपयोग केस है, और यह पूरी तरह से समझने योग्य है कि क्या हो रहा है।

0

पहला धन्यवाद तेज़ और परिष्कृत उत्तर के लिए आवंटित।

स्क्रैच से एक दूसरा परीक्षण इंगित करता है कि AJAX-ईवेंट ठीक से कतारबद्ध हैं।

तो फिर मैंने ऊपर वर्णित अधिक जटिल परिदृश्य की जांच की। छोड़े गए कार्यक्रम के कारण हमारे 'व्यस्त ओवरले' से संबंधित हैं। इसे जावास्क्रिप्ट का एक समूह के रूप में सोचें जो फॉर्म-तत्वों को अक्षम करता है और लंबे समय तक चलने वाले AJAX अनुरोधों के दौरान ओवरले लागू करता है। यह jsf.ajax.addOnEvent कॉल-बैक लागू करके किया जाता है।

वैसे भी, हम कुछ नियंत्रण अक्षम करते हैं, 'सफलता' के बाद फॉर्म एक उचित स्थिति में है और दूसरी घटना को संभाला जा सकता है।

वर्तमान में मुझे लगता है कि 'अस्थायी रूप से अक्षम' बटन संबंधित कार्रवाई घटना से समझौता करता है जिसे बाद में किया जाना चाहिए।

हम वर्तमान में इस मुद्दे का विश्लेषण कर रहे हैं और मैं अंतिम परिणाम Asap पोस्ट करूंगा।

+0

क्या आपको कोई समाधान मिला? मुझे पता है कि यह काफी पीछे पोस्ट किया गया था लेकिन मुझे एक ही समस्या का सामना करना पड़ रहा है। मुझे "व्यस्त ओवरले" को हटाने या उस पर देरी डालने के बिना समाधान नहीं मिल रहा है। –