2012-03-08 6 views
26

कर मैं एक संवाद के अंदर एक रूप है जो मैं ajax साथ CommandButton पर क्लिक करके बंद करते हैं,एक सत्यापन त्रुटि के संकेत (आवश्यक = "true") को खोजने के लिए कैसे जबकि ajax आदेश

इस

<h:commandButton value="Add" action="#{myBean.addSomething(false)}" 
    id="add_something_id" > 
    <f:ajax render="@form someTable" execute="@form" 
     onevent="closeAddNewSomethingDialogIfSucceeded"></f:ajax> 
</h:commandButton> 
की तरह है

और यहाँ यहाँ तक संवाद

function closeAddNewSomethingDialogIfSucceeded(data) { 
     if(data.status === 'success') { 
      $("#dialog_id").dialog("close"); 
     } 
    } 

कोई समस्या नहीं बंद करने के लिए जे एस कोड है ...

अब मैं required="true" में संवाद प्रपत्र फ़ील्ड्स के कुछ बदल गया है और अब मैं संवाद की मैं सत्यापन त्रुटियों मिला के समापन ...

रोकना चाहते हैं, लेकिन ajax data.status अभी भी अपनी success अवस्था में पहुँचता है, और मैं नहीं कर सकता यह पता लगाने के लिए कि सत्यापन विफलता का संकेत क्या है ...

कोई विचार?

BalusC जवाब देने के लिए धन्यवाद मैं निम्नलिखित किया:

JSF में

, कहा:

<h:panelGroup id="global_flag_validation_failed_render"> 
     <h:outputText id="global_flag_validation_failed" value="true" 
      rendered="#{facesContext.validationFailed}"/> 
    </h:panelGroup> 

च: ajax

<f:ajax render="@form someTable global_flag_validation_failed_render" 

में बदल दिया गया और जे एस में जोड़ा निम्नलिखित

if(data.status === 'success') { 
    if($("#global_flag_validation_failed").length === 0){ 
     $("#dialog_id").dialog("close"); 
    } 
} 

उत्तर

49

विशेष रूप से required="true" के लिए नहीं, लेकिन यदि आप सामान्य रूप से सत्यापन विफल हो गए हैं तो आप #{facesContext.validationFailed} से जांच सकते हैं। आप पता चल सके कि प्रश्न में बटन #{not empty param[buttonClientId]} द्वारा दबाया जाता है के साथ इस गठबंधन है, तो आप इसे एक साथ <h:outputScript> की rendered विशेषता में डाल सकते हैं इस प्रकार है:

<h:commandButton id="add_something_id" binding="#{add}" value="Add" action="#{myBean.addSomething(false)}"> 
    <f:ajax execute="@form" render="@form someTable" /> 
</h:commandButton> 
<h:outputScript rendered="#{not empty param[add.clientId] and not facesContext.validationFailed}"> 
    $("#dialog_id").dialog("close"); 
</h:outputScript> 

(ध्यान दें कि आप सुनिश्चित करने की आवश्यकता है कि स्क्रिप्ट भी च द्वारा फिर से प्रदान की गई है: ajax)

एक hacky सा है, लेकिन यह onevent समारोह में इसे संभाल पाना संभव नहीं है मानक JSF कार्यान्वयन ajax जवाब में मान्यता स्थिति के बारे में कोई भी जानकारी उपलब्ध नहीं कराता ।

यदि आप RichFaces का उपयोग करते हैं, तो आप कमांड बटन/लिंक की oncomplete विशेषता में ईएल का उपयोग कर सकते हैं।वे अर्थात् मानक JSF और PrimeFaces में के रूप में एक पर-व्यू के आधार पर करने के बजाय एक प्रति अनुरोध के आधार पर मूल्यांकन किया जाता है:

<a4j:commandButton ... oncomplete="if (#{!facesContext.validationFailed}) $('#dialog_id').dialog('close')" /> 

या यदि आप PrimeFaces उपयोग करने के लिए होता है, तो आप इस तथ्य का लाभ ले सकता है कि PrimeFaces जो oncomplete विशेषता का जावास्क्रिप्ट दायरे में सीधे इंजेक्ट किया जाता है एक अतिरिक्त args.validationFailed विशेषता के साथ ajax प्रतिक्रिया फैली हुई:

<p:commandButton ... oncomplete="if (args &amp;&amp; !args.validationFailed) $('#dialog_id').dialog('close')" /> 

(ध्यान दें कि &amp;& के बजाय इस्तेमाल किया गया है, क्योंकि & एक विशेष charact है एर एक्सएमएल/XHTML में)

या आप सेम की कार्रवाई विधि में PrimeFaces 'RequestContext एपीआई इस्तेमाल कर सकते हैं प्रोग्राम के रूप में प्रदान की गई दृश्य में जावास्क्रिप्ट निष्पादित करने के लिए।

RequestContext.getCurrentInstance().execute("$('#dialog_id').dialog('close')"); 

कोई सशर्त चेकों के लिए आवश्यक हैं के रूप में सेम की कार्रवाई विधि वैसे भी लागू नहीं किया जाएगा जब सत्यापन नाकाम रही है।

+0

धन्यवाद ठीक करने के लिए पर्याप्त है! आखिरकार मैंने # {चेहरे कोटेक्स्ट.एलिडेशनफेल} पर भरोसा किया (मुझे इसके बारे में पता नहीं था) मैंने इसे सरल आउटपुट्यूट की रेंडर हालत में इस्तेमाल किया ... और बाद में जेएस कोड में मैंने jquery का उपयोग करके उस outputtext अस्तित्व के लिए जांच की लम्बाई ... – Daniel

+0

आपका स्वागत है। जेएसएफ में निहित ईएल ऑब्जेक्ट्स के अवलोकन के लिए, यह भी देखें [यह] (http://balusc.blogspot.com/2011/09/communication-in-jsf-20.html#ImplicitELObjects)। – BalusC

+1

@ बाल्लूसी क्या चेहरे का चयन करता है। वैधता विफलता रूपांतरण विफलताओं के लिए भी लागू होती है? क्या यह सच है अगर रूपांतरण विफल हो गया है? – Bren

2

मुझे लगता है कि आपको प्राइमफेसेस 'RequestContext पर एक नज़र डालना चाहिए। यह आपको सर्वर पक्ष पर क्लाइंट-साइड कोड ट्रिगर करने में मदद करेगा।

2

दो बातें 1) 'onevent' समारोह

निश्चित रूप से आप अनिवार्य क्षेत्र के लिए एक संदेश टैग है में किसी त्रुटि के लिए जाँच हो रही है?

<h:message id="m-my-field-id" for="my-field-id" errorClass="error-class"/> 

तो तुम

var message = $('#m-my-field-id'); 

if(message.hasClass('error-class'){ 
    //do this 
} 
else{ 
    //do that 
} 

2 की तरह त्रुटि स्तरीय कुछ के लिए जाँच कर सकते हैं) डोम सफलता

पर तारीख तक नहीं है हाँ, मैं पर संदेश देख सकते हैं फ़ायरफ़ॉक्स में पेज, फिर भी jQuery मुझे बताता है कि यह वहां नहीं है।

मैं ने पाया है कि छोटी संभव समय समाप्ति का उपयोग कर इस

setTimeout(
    function(){ 
    setErrorStyle(source.attr('id')); 
    }, 
    1 
); 
संबंधित मुद्दे