2013-01-14 25 views
8

मेरे पास एक CRUD पृष्ठ है जो एक प्राइमफ़ेस डेटाटेबल में क्वेरी (डोमेन ऑब्जेक्ट्स की एक सूची) से डेटा दिखाता है।<p:dialog> रखें जब सत्यापन विफल हो गया है

<p:dataTable 
       id="negozi" 
       var="n" 
       value="#{nController.theListFromQuery}" 
       rowKey="#{n.id}" 
       selection="#{nController.selected}" 
       selectionMode="single"> 

       <p:column headerText="Field1"> 
        <h:outputText value="#{n.f1}" /> 
       </p:column> 
       <p:column headerText="Field2"> 
        <h:outputText value="#{n.f2}" /> 
       </p:column> 
<p:column style="width:4%"> 
        <p:commandButton 
         actionListener="#{nController.prepareEdit(n)}" 
         update=":editDialogId" 
         oncomplete="editDialog.show()" 
         value="Edit" /> 
       </p:column> 
... 

संपादित करें बटन पर क्लिक करके एक संवाद दिखाया जाएगा:

<p:dialog 
       header="Edit N" 
       widgetVar="editDialog" 
       id="editDialogId"> 

        <h:form id="formDialog"> 

         <h:panelGrid id="editDialogTable" columns="2" cellpadding="10" style="margin:0 auto;"> 

          <p:outputLabel for="field1" value="F1:" /> 
          <p:inputText id="field1" value="#{nController.selected.f1}" /> 
          <p:outputLabel for="field2" value="F2:" /> 
          <p:inputText id="field2" value="#{nController.selected.f2}" /> 
<p:commandButton 
         value="Confirm" 
         actionListener="#{nController.doEdit}" 
         update=":form" 
         oncomplete="editDialog.hide()" 
         rendered="#{nController.selected.id!=null}" />     
... 

यह काम करता है। अब मैं एफ 1 को एक आवश्यक फ़ील्ड बनाना चाहता हूं।

मैं इनपुट टेक्स्ट क्षेत्र में "आवश्यक" विशेषता जोड़ता हूं और क्या होता है?

जब मैं आवश्यक फ़ील्ड के बिना प्रपत्र पुष्टि करने के लिए प्रयास करते हैं, इकाई संपादित किया जाता है नहीं (यह सही है), लेकिन संवाद बंद कर दिया है (यह सही नहीं है!)

मैं लाल देख सकते हैं जब मैं संवाद को पुनः खोलें आवश्यक (और अमान्य) फ़ील्ड पर हाइलाइट करें।

यदि मैं अमान्य है तो संवाद बंद करने से रोकने के लिए मैं क्या चाहता हूं।

क्या मुझे कुछ जेएस लिखना है या जेएसएफ मेरी मदद करेगा?

उत्तर

30

प्राइमफेस AJAX प्रतिक्रिया args ऑब्जेक्ट को उस क्षेत्र में रखती है जिसमें validationFailed संपत्ति है। आप इसका इस्तेमाल कर सकते हैं।

oncomplete="if (args &amp;&amp; !args.validationFailed) PF('editDialog').hide()" 

तुम एक पुन: प्रयोज्य जे एस कार्य करने के लिए यह refactor सकता है इस प्रकार है (args Precheck एक अपवाद अनुरोध दौरान फेंक दिया जाता है जब करने के लिए एक जे एस त्रुटि का कारण नहीं आवश्यक है)।

oncomplete="hideDialogOnSuccess(args, 'editDialog')" 
function hideDialogOnSuccess(args, dialogWidgetVar) { 
    if (args && !args.validationFailed) { 
     PF(dialogWidgetVar).hide(); 
    } 
} 
2

मेरा मानना ​​है कि यह साफ समाधान है। ऐसा करने से आप को अपने बटन कोड को बदलने की आवश्यकता नहीं है। यह समाधान छुपा कार्य प्रोटोटाइप को ओवरराइड करता है। तुम सिर्फ जरूरत सेट CommandButton इस प्रकार

<p:commandButton value="Save" oncomplete="videoDetalheDialogJS.hide();" 
    actionListener="#{videoBean.saveVideo(video)}" /> 
+0

यह "सबसे साफ" कैसे है? आप आसानी से उपलब्ध एक चर चेक को जोड़ने के विकल्प पर 11-लाइन फ़ंक्शन की अनुशंसा कर रहे हैं? – kolossus

+0

अच्छी तरह से .. मैं आपको इंगित करता हूं .. लेकिन यहां की बात "पारदर्शी छिपाने" है; मेरा मतलब है ... आप हमेशा नियमित रूप से छुपाते हैं() चाहे यह मान्य है या नहीं (कभी-कभी परीक्षण करने के बजाए); आप हर जगह छिपाने के लिए कहते हैं: oncomplete = "editDialog.hide()" और अगर सत्यापन विफल हो जाएगा या नहीं परवाह नहीं है; इसे "नीचे" संभाला जाएगा ... –

0

संवाद विफल सत्यापन पर खुला रखने के लिए,:

<p:commandButton value="save" 
action="#{YourBean.yourActionMethod}" 
oncomplete="if (!args.validationFailed) PF('yourDialogWidgetVar').hide()"/> 

मैं

$(document).ready(function() { 
    PrimeFaces.widget.Dialog.prototype.originalHide = PrimeFaces.widget.Dialog.prototype.hide; // keep a reference to the original hide() 
    PrimeFaces.widget.Dialog.prototype.hide = function() { 
     var ajaxResponseArgs = arguments.callee.caller.arguments[2]; // accesses oncomplete arguments 
     if (ajaxResponseArgs && ajaxResponseArgs.validationFailed) { 
      return; // on validation error, prevent closing 
     } 
     this.originalHide(); 
    }; 
}); 

इस तरह, आप की तरह अपने कोड रख सकते यहां एक पूर्ण उदाहरण छोड़ने वाला होगा:

<h:form id="ad-form"> 
      <p:dialog id="ad-dialog" widgetVar="adDialog" modal="true" width="400" 
      closeOnEscape="true" resizable="false" header="Addreass"> 

      <p:messages id="a-msgs" closable="true" /> 

      <h:panelGrid columns="2" id="ad-painel-dialog" width="100%"> 
       <p:outputLabel value="Country" for="country" /> 
       <p:inputText id="country" style="width:100%" 
        value="#{clientSaverBean.editableAddress.country}" /> 

       <p:outputLabel value="City" for="city" /> 
       <p:inputText id="city" 
        value="#{clientSaverBean.editableAddress.city}" /> 

       <p:outputLabel value="Zip-Code" for="zipcode" /> 
       <p:inputText id="zipcode" 
        value="#{clientSaverBean.editableAddress.zipCode}" /> 

       <p:outputLabel value="Street" for="street" /> 
       <p:inputTextarea id="street" 
        value="#{clientSaverBean.editableAddress.street}" /> 

       <p:outputLabel value="Number" for="number" /> 
       <p:inputText id="number" 
        value="#{clientSaverBean.editableAddress.number}" /> 

       <h:panelGroup /> 

       <f:facet name="footer"> 
        <p:commandButton value="save" 
         action="#{clientSaverBean.saveAddress}" 
         process=":ad-form:ad-dialog" 
         update=":ad-form:a-msgs :ad-form:ad-painel-dialog :client-form:ad-table" 
         oncomplete="if (!args.validationFailed) PF('adDialog').hide()"/> 
       </f:facet> 
      </h:panelGrid> 
     </p:dialog> 

    </h:form> 
+4

आप पहले से दिए गए उत्तर को दोहरा क्यों रहे हैं? – BalusC

4

यह पोस्ट अब तीन साल का है, लेकिन मुझे मदद मिली है, इसलिए मेरे निष्कर्ष दूसरों की मदद कर सकते हैं।

कम से कम पीएफ 5.x में, ऐसा लगता है कि बलुससी द्वारा प्रदान किया गया समाधान दो तरीकों से संशोधित किया जाना है। (1) अधूरा ईवेंट हैंडर में कॉल के लिए "args" तर्क जोड़ें, और (2) पीएफ टेबल में विजेट की पहचान करने के लिए पीएफ प्राइमफेस आदिम का उपयोग करें।यहां मैं जिस कोड का उपयोग कर रहा हूं वह है:

oncomplete="hideDialogOnSuccess(args, PF('editDialog'))" 

function hideDialogOnSuccess(args, dialogWidgetVar) { 
    if (args && !args.validationFailed) { 
     dialogWidgetVar.hide(); 
    } 
} 
+0

आपको ज्यादा प्रतिष्ठा नहीं मिलती है, लेकिन आप, स्वीकृत उत्तर के संपादन का सुझाव दे सकते हैं। इसके बजाय आप 'असली दुनिया' प्रतिष्ठा और प्रशंसा प्राप्त करते हैं ;-) कभी कम नहीं ... दोनों – Kukeltje

+0

ऊपर उठाए गए बलससी ने अपना जवाब अपडेट कर दिया है, इसलिए मेरा अब अप्रासंगिक है। उसे देखें – LaurentV

+0

मैंने पहले यहां टिप्पणी करने से पहले ही किया था (टाइमस्टैम्प को देखकर) क्षमा करें ... वैसे भी धन्यवाद और साझा करने के लिए धन्यवाद – Kukeltje

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