2016-10-10 9 views
5

मैं कई इनपुट घटकों को प्रमाणित करने के लिए OmniFaces' <o:validateAll> सत्यापनकर्ता का उपयोग करता हूं। यह तब तक ठीक काम करता है जब तक कि मैं इसे RichFaces <rich:tabPanel> में नहीं डालता। जब मैं ऐसा करता हूं और फ़ील्ड को रिक्त छोड़ देता हूं, तो सत्यापन विफल रहता है (अपेक्षित के रूप में), लेकिन असफल सत्यापन के बावजूद सक्रिय टैब बदल जाता है। जब भी सत्यापन विफल हो जाता है, तो मैंने अन्य सत्यापनकर्ताओं को tabPanel को दूसरे टैब पर स्विच करने से रोकने की कोशिश की।<o: validateAll> अन्य मान्यताओं से अलग क्यों व्यवहार करता है?

इसका कारण क्या हो सकता है?

मैं वर्तमान में ओमनीफेस 2.1 और रिचफेस 4.5.17 का उपयोग कर रहा हूं। वाइल्डफ्लाई 9.0.2 पर मोजररा 2.2.12 के साथ अंतिम।

<ui:composition xmlns:ui="http://xmlns.jcp.org/jsf/facelets" 
       xmlns:f="http://xmlns.jcp.org/jsf/core" 
       xmlns:h="http://xmlns.jcp.org/jsf/html" 
       xmlns:o="http://omnifaces.org/ui" 
       xmlns:rich="http://richfaces.org/rich"> 

    <h:form id="form"> 

     <rich:messages /> 

     <rich:tabPanel id="tabPanel"> 

     <rich:tab id="tab1" header="Tab 1"> 
      <h:inputText id="myDouble" value="#{someDoubleVal}"> 
      <f:validateDoubleRange minimum="1.0" maximum="2.0"/> 
      </h:inputText> 
      <o:validateAll id="allValid" components="myDouble" message="Missing value!" /> 
     </rich:tab> 

     <rich:tab id="tab2" header="Tab 2"> 
      Just another tab to switch. 
     </rich:tab> 

     </rich:tabPanel> 

    </h:form> 

</ui:composition> 

1,0 और 2.0 के बाहर एक मान दर्ज करें और अपेक्षित व्यवहार को देखने के लिए टैब 2 पर स्विच करके देखें, <f:validateDoubleRange> से शुरू हो रहा:

यहाँ समस्या पुन: पेश करने एक्सएचटीएमएल कोड है एक चेहरे-संदेश प्रदर्शित किया जाता है और पहला टैब अभी भी सक्रिय है।

इनपुट खाली छोड़ दें और <o:validateAll> के व्यवहार को देखने के लिए टैब 2 पर स्विच करने का प्रयास करें: सत्यापन विफल रहता है (चेहरे-संदेश प्रदर्शित होता है), लेकिन टैब 2 सक्रिय है।

अद्यतन: वर्णित व्यवहार switchType="ajax" (डिफ़ॉल्ट) के साथ-साथ switchType="server" साथ साथ लागू होता है। दोनों स्थितियों में, टैब-पैनल शामिल इनपुटों को सबमिट करता है, इसलिए उपयोगकर्ताओं के दृष्टिकोण से, एक टैब-स्विच <h:commandButton> सबमिट के समान प्रतीत होता है (तकनीकी रूप से अंतर हो सकता है, मुझे नहीं पता टैब-पैनल के कार्यान्वयन विवरण)।

अगर मैं एक <f:setPropertyActionListener> के साथ एक नियमित <h:commandButton> के माध्यम से टैब स्विच करते हैं, <o:validateAll> अन्य प्रमाणकों के रूप में एक ही रास्ता है, यानी टैब स्विच मान्यता त्रुटि के कारण नहीं किया जाता है व्यवहार करता है।

<rich:tabPanel id="tabPanel" activeItem="#{bb.activeTab}"> 
... 
    <rich:tab id="tab1" name="tab1" header="Tab 1"> 
    ... 
    <h:commandButton value="submit"> 
     <f:setPropertyActionListener value="tab2" target="#{bb.activeTab}" /> 
    </h:commandButton> 
    ... 
    </rich:tab> 
</rich:tabPanel> 

नोट: यह सिर्फ एक minimalistic समस्याग्रस्त व्यवहार दिखा उदाहरण है। मेरे वास्तविक कोड में मेरे पास <o:validateAll> द्वारा मान्य एक भी घटक नहीं है और मैं वास्तव में इनपुट मानों को बैकिंग-बीन से जोड़ता हूं। मनाया व्यवहार बिल्कुल वही है।

+0

मुझे अभी एहसास हुआ, एक्सएचटीएमएल कोड में '' टैग की स्थिति बदलना व्यवहार बदलता है! इसे उन घटकों के सामने रखें जिन्हें वास्तव में मान्य किया जाना चाहिए और यह अपेक्षा के अनुसार काम करता है। क्या यह वांछित व्यवहार या OmniFaces में एक बग है? दस्तावेज़ीकरण इस प्रभाव का जिक्र नहीं करता है। कोई विचार? –

+0

यह सुनिश्चित नहीं है कि कितना समृद्ध है: टैबपेनल कवर के तहत काम करता है, लेकिन ऑर्डरिंग व्यवहार को http://omnifaces.org/docs/javadoc/2.5/org/omnifaces/component/validator/ValidateMultipleFields के पहले "सामान्य उपयोग" अनुच्छेद में दस्तावेज किया गया है। एचटीएमएल – BalusC

+0

सही, ऑर्डरिंग व्यवहार दस्तावेज है। लेकिन यह भी कहता है "_This सत्यापनकर्ता को फॉर्म में कहीं भी रखा जा सकता है, लेकिन ध्यान रखें कि घटकों को फॉर्म में दिखाई देने के क्रम में मान्य किया जाएगा ._"। हालांकि, यह स्पष्ट नहीं करता है कि सत्यापन आसपास के टैब-पैनल के विभिन्न व्यवहार को क्यों ट्रिगर करता है। लेकिन हो सकता है कि यह RichFaces घटक है जो यहां अजीब है। मैं इंप्रेशन के तहत हूं, रिचफेस में वैसे भी ऐसी विषमताएं हैं। शायद मैं प्राइमफेस के साथ उदाहरण का प्रयास करूंगा और देख सकता हूं कि यह कैसे काम करता है। –

उत्तर

2

समस्या दो गुना है।

सबसे पहले समस्या यह है, <o:validateAll> स्पष्ट context.renderResponse() फोन नहीं करता है जब सत्यापन में नाकाम रही है और JSF को यह काम छोड़ देता है जो परोक्ष दौरान सत्यापन चरण के दौरान यह फोन करेगा जब कम से कम एक इनपुट घटक <o:validateAll> के बाद अवैध पाया जाता है समाप्त हो गया है, या अन्यथा बाद के अद्यतन मॉडल मूल्य चरण।

दूसरी समस्या है, <rich:tabPanel> टैब स्विच इवेंट आवेदन चरण के लिए अद्यतन मॉडल मान चरण के लिए कतारबद्ध है। मुझे यकीन नहीं है कि क्यों RichFaces लोगों ने इसे इस तरह डिज़ाइन किया है, लेकिन नतीजा यह है कि टैब स्विच इवेंट को वैसे भी निकाल दिया जाता है जब सत्यापन मॉडल मान चरण के दौरान सत्यापन विफल हो जाता है।

जब आप कम से कम एक जुड़े इनपुट घटक से पहले <o:validateAll> ले जाते हैं, तो JSF परोक्ष context.renderResponse() सत्यापन चरण के दौरान पहले से ही है और इसलिए पूरी तरह से कॉल करेंगे अद्यतन मॉडल मान चरण छोड़ सकते हैं और इसलिए पंक्तिबद्ध <rich:tabPanel> टैब स्विच घटना बनने का मौका नहीं होगा सक्रिय किया गया।

मैंने इसे issue 322 के अनुसार OmniFaces 2.6-SNAPSHOT में तय कर दिया है। OmniFaces 2.6 या नए का उपयोग करते समय, अब टैब स्विच इवेंट के वांछित व्यवहार को प्राप्त करने के लिए पेड़ में <o:validateAll> पर ध्यान नहीं दिया जाना चाहिए।

+0

OmniFaces में फिक्स के लिए विस्तृत उत्तर और धन्यवाद के लिए धन्यवाद। –

+0

इस सवाल पूछने के लिए धन्यवाद। – BalusC

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

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