2013-04-26 8 views
6

के बाद बंद पर संवाद, मुझे p:dialog घटक AJAX के माध्यम से सबमिट किया गया है। संवाद में फॉर्म ui:include के माध्यम से .xhtml के माध्यम से केवल फ़ॉर्म और उसके घटकों (नहीं, मैं रूपों को घोंसला नहीं कर रहा हूं; संवाद स्वयं किसी भी रूप में नहीं है) के माध्यम से है। शामिल पृष्ठ का बैकिंग बीन 'व्यूस्कोप्ड' है।पी में स्पष्ट फॉर्म: असफल कार्रवाई/विधि कॉल

सबसे सब कुछ ठीक ढंग से काम:

  • सफल मान्यता पर, प्रपत्र विधि बचाने निष्पादित करेंगे; सफल बचत के बाद, संवाद बंद हो जाता है; बाद के रिकॉर्ड खोलने से डेटाबेस से उचित रिकॉर्ड जानकारी दिखाई देती है।
  • असफल सत्यापन पर, सबमिट किए गए मान जारी रहते हैं और संवाद खुला रहता है और सत्यापन त्रुटियों को प्रदर्शित करता है, अमान्य फ़ील्ड को ठीक करता है और परिणाम को एक सफल सहेजने में पुनः सबमिट करता है।

समस्या तब होती है जब p:commandButton द्वारा बुलाया जाता है। यदि यह विफल हो जाता है, तो संवाद खुला रहता है और उपयोगकर्ता को h:messages के माध्यम से "परिवर्तनों को सहेजने में त्रुटि" प्रदर्शित करता है; इसके अतिरिक्त, सबमिट किए गए मान अभी भी इनपुट फ़ील्ड में बने रहते हैं। यह ठीक है (और यहां तक ​​कि वांछित) जबकि फॉर्म खुला रहता है, हालांकि - संवाद बंद करने और इसे फिर से खोलने पर, सबमिट किए गए मान टेक्स्ट फ़ील्ड में स्थिर हैं। यह खराब है क्योंकि यह उपयोगकर्ता को यह इंप्रेशन देता है कि सहेजने में सफल रहा (क्योंकि h:messages घटक अब संवाद अद्यतन के कारण खाली है)।

  • 1,1) संवाद खुला पर सेम का एक नया उदाहरण के लिए शामिल प्रपत्र के समर्थन की फलियों की स्थापना:

    अब तक मैं निम्नलिखित, जिनमें से कोई भी समस्या निवारण की है की कोशिश की है।

  • 1.2) चूंकि बीन अब एक नया उदाहरण है, इसलिए मैं डेटा बीन से विवरण के साथ एड्रेस ऑब्जेक्ट को दोबारा बदल रहा हूं।
  • 2.1) में p:resetInput घटक के साथ घटक के साथ p:commandButton "रद्द करें" बटन जोड़ने के साथ संवाद पर बंद करें बटन को अक्षम करना और फ़ॉर्म को रीसेट करने के लिए इसे "रद्द करें" बटन जोड़ना। (संवाद बंद हो जाता है, लेकिन प्रपत्र में मान सबमिट किए जाते हैं)।
  • 2.2) इस p:commandButton से एक विधि को कॉल करना जो शामिल फॉर्म के बैकिंग बीन के लिए RequestMap को हटा देता है।
  • 2.3) immediate=true और immediate=false दोनों पर सेट बटन के साथ प्रयास किया गया।
  • 2.4) बटन सेट के साथ [email protected] पर कोशिश की गई, एक समान रणनीति जिसे मैंने एक फॉर्म बंद करने के लिए उपयोग किया है, यह सुनिश्चित करने के लिए कि फिर से खोलने पर ताजा फ़ील्ड हों।

आप बैकिंग बीन को एक नए उदाहरण में सेट करने और एड्रेस ऑब्जेक्ट को दोबारा लगाने के बीच सोचेंगे, मैं एक नया फॉर्म देख रहा हूं, लेकिन एनओपीई।

mainform.xhtml

<p:dialog id="dlgAddress" 
       header="Address Edit" 
       widgetVar="dialogAddress" 
       dynamic="true" 
       modal="false" 
       closable="false" 
       resizable="false" 
       styleClass="dlgAddress" 
       visible="#{addressform.showDlgAddress}"> 
     <ui:include src="addressform.xhtml"/> 
    </p:dialog> 

addressform का भाग:

यहाँ स्रोत के कुछ है।एक्सएचटीएमएल

<h:form id="fDlgAddress"> 
    <div id="addresses-container"> 
     <h:messages id="msgDlgAddress" errorClass="errormsg" infoClass="infomsg1" layout="table"/> 
     <h:panelGrid columns="1" 
        styleClass="pgAddresses" 
        rendered="#{!addressform.address.exists}"> 
      <h:outputText value="No active #{addressform.address.atypCode} address found." 
          styleClass="record-not-exists"/> 
      <h:outputText value="Use the form below to create one."/> 
     </h:panelGrid> 
     <p:panelGrid columns="2" 
        styleClass="pgDlgForm pgAddresses"> 
      <h:outputLabel value="Address Type"/> 
      <h:inputText id="atypCode1" 
         value="#{addressform.address.atypCode}" 
         disabled="true" 
         rendered="#{addressform.address.exists}"/> 
      <h:selectOneMenu id="atypCode2" 
          value="#{addressform.address.atypCode}" 
          rendered="#{!addressform.address.exists}"> 
       <f:selectItems value="#{addressform.atypCodeList}" 
           var="atyp" 
           itemValue="#{atyp}" 
           itemLabel="#{atyp}"/> 
      </h:selectOneMenu> 
      <h:outputLabel value="Street 1" 
          for="street1"/> 
      <h:inputText id="street1" 
         value="#{addressform.address.addressLine1}"/> 
      <h:outputLabel value="Street 2" 
          for="street2"/> 
      <h:inputText id="street2" 
         value="#{addressform.address.addressLine2}"/> 
      <h:outputLabel value="Street 3" 
          for="street3"/> 
      <h:inputText id="street3" 
         value="#{addressform.address.addressLine3}"/> 
      <h:outputLabel value="Street 4" 
          for="street4"/> 
      <h:inputText id="street4" 
         value="#{addressform.address.addressLine4}"/> 
      <h:outputLabel value="City" 
          for="city"/> 
      <h:inputText id="city" 
         value="#{addressform.address.city}" 
         required="true" 
         requiredMessage="Please enter a city."/> 
      <h:outputLabel value="State" 
          for="statCode"/> 
      <h:selectOneMenu id="statCode" 
          value="#{addressform.address.stateCode}"> 
       <f:selectItem itemLabel="Select State/Province" 
           itemValue=""/> 
       <f:selectItems value="#{states.statesList}" 
           var="stat" 
           itemValue="#{stat.statCode}" 
           itemLabel="#{stat.statDesc}"/> 
      </h:selectOneMenu> 
      <h:outputLabel value="Zip Code" 
          for="zipCode"/> 
      <h:inputText id="zipCode" 
         value="#{addressform.address.zip}"/> 
      <h:outputLabel value="Country" 
          for="natnCode"/> 
      <h:selectOneMenu id="natnCode" 
          value="#{addressform.address.nationCode}" 
          required="true" 
          requiredMessage="Please choose a nation."> 
       <f:selectItem itemLabel="Select Country" 
           itemValue=""/> 
       <f:selectItems value="#{nations.nationsList}" 
           var="natn" 
           itemValue="#{natn.natnCode}" 
           itemLabel="#{natn.natnDesc}"/> 
      </h:selectOneMenu> 
      <h:outputLabel value="From Date" 
          for="fromDate"/> 
      <p:calendar id="fromDate" 
         value="#{addressform.address.fromDate}" 
         showButtonPanel="true"/> 
      <h:outputLabel value="To Date" 
          for="toDate"/> 
      <p:calendar id="toDate" 
         value="#{addressform.address.toDate}" 
         showButtonPanel="true"/> 
      <h:outputLabel value="Inactivate" 
          for="inactivateAddress" 
          rendered="#{addressform.address.exists}"/> 
      <h:selectBooleanCheckbox id="inactivateAddress" 
            value="#{addressform.address.inactivate}" 
            rendered="#{addressform.address.exists}"/> 
      <h:outputLabel value="Delete" 
          for="deleteAddress" 
          rendered="#{addressform.address.exists}"/> 
      <h:selectBooleanCheckbox id="deleteAddress" 
            value="#{addressform.address.delete}" 
            rendered="#{addressform.address.exists}"/> 
     </p:panelGrid> 
    </div> 
    <div class="button-container"> 
     <p:commandButton value="Save Changes" 
         action="#{addressform.save}" 
         type="submit" 
         ajax="true" 
         process="@form" 
         update="@form"/> 
     <p:commandButton value="Cancel" 
         process="@this" 
         onclick="dialogAddress.hide();"> 
      <p:resetInput target="fDlgAddress"/> 
     </p:commandButton> 
    </div> 
</h:form> 

Recorddetailsform (जिसमें से पता संवाद कहा जाता है फार्म के लिए समर्थन सेम)

public void showDlgAddress(){ 
     FacesContext ctx = FacesContext.getCurrentInstance(); 
     ELResolver resolver = ctx.getApplication().getELResolver(); 
     RecordDetails recordDetails = (RecordDetails) resolver.getValue(ctx.getELContext(), null, "recordDetails"); 

     //Set addressform backing bean to new instance and load address into it from recordDetails 
     resolver.setValue(ctx.getELContext(), null, "addressform", new Addressform()); 
     Addressform addressform = (Addressform) resolver.getValue(ctx.getELContext(), null, "addressform"); 
     addressform.setAddress(recordDetails.getAddress()); 
    } 

Addressform (पते प्रपत्र के समर्थन सेम)

public void save() { 
    FacesContext ctx = FacesContext.getCurrentInstance(); 
    RequestContext rctx = RequestContext.getCurrentInstance(); 
    ELResolver resolver = ctx.getApplication().getELResolver(); 
    Records records = (Records) resolver.getValue(ctx.getELContext(), null, "records"); 
    RecordDetails recordDetails = (RecordDetails) resolver.getValue(ctx.getELContext(), null, "recordDetails"); 
    Mainform mainform = (Mainform) resolver.getValue(ctx.getELContext(), null, "mainform"); 
    Person person = (Person) resolver.getValue(ctx.getELContext(), null, "person"); 

    //Pretty lengthy SQL stuff here. Commented out. Just wanted to display the display logic below for the dialog. 

    if (errorMsg != null) {//If errorMsg is not null, then error occurred. 
     showDlgAddress = true;//Ensures address dialog remains open in event of action error. 
     queueErrorMessage(errorMsg); 
     rctx.update("dlgAddress"); 
     return;//break out of method on error. 
    } else { 
     showDlgAddress = false; 
     rctx.update("dlgAddress"); 
    } 

    //If everything saves without error, repopulate address and update recordDetails dialog. 
    recordDetails.populateAddress(records.getSelectedRecord()); 
    mainform.updateDlgRecordDetails(); 
} 

अन्य जानकारी:

  • JSF2
  • Primefaces 3.5
  • बिलाव 6.0
  • Netbeans

उत्तर

13

इस प्रयास करें:

  1. एक रूप के अंदर अपने संवाद रखो (dialogInputForm)

  2. जोड़ें अटारी bute अद्यतन = ": dialogInputForm":

    <p:commandButton process="@this" actionListener="#{bean.prepare}" update=":dialogInputForm" oncomplete="thirdPartyDialog.show()" value="Open Input Dialog" > 
        <p:resetInput target=":dialogInputForm" /> 
    </p:commandButton> 
    

    और प्रपत्र

  3. नेस्ट बटन संवाद खोलता है और CommandButton अभी बनाया प्रपत्र

के रूप में लक्ष्य को निर्दिष्ट है कि भीतर resetInput टैग जो संवाद

<h:form id="dialogInputForm" > 
... your dialog ... 
</h:form> 
+0

हमम ... मैं इसे कल काम पर आजमा सकता हूं, लेकिन मुझे लगता है कि मैंने पहले ही यह कोशिश की है। परिणाम पी था: resetInput ने प्रपत्र को प्रकट करने के लिए प्रतीत किया क्योंकि कोई रिकॉर्ड लोड नहीं हुआ था, न केवल पिछले रिकॉर्ड से "अटक" सबमिट किए गए मानों को साफ़ करने के लिए, बल्कि नए आने वाले रिकॉर्ड के मान भी साफ़ कर रहा था। – mousouchop

+0

अविश्वसनीय रूप से यह समाधान काम करता है! मैं अपने संवाद के मूल्यों को रीसेट करने की इस समस्या के बारे में बेताब था। '' चाल है। आपका बहुत बहुत धन्यवाद! –

+1

हां। मैंने पाया है कि यह भरोसेमंद काम करता है। हालांकि मैं अपने संवाद में अपने रूपों को घोंसला करता हूं, जो किसी समस्या का कारण नहीं लग रहा है। मुझे लगता है कि मेरी समस्या तब आई जब '' फॉर्म 'का उपयोग करके' 'के लक्ष्य के रूप में शुरू किया गया। आपको ** इस घटक में एक वास्तविक फॉर्म आईडी का उपयोग करना चाहिए, और उपरोक्त आपके उदाहरण के समान ही फॉर्म को अपडेट करना होगा। धन्यवाद। – mousouchop

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