कोणीय 2: फॉर्म जमा नहीं होने के कारण रद्द कर दिया गया


84

मेरे पास एक मोडल है जिसमें एक फॉर्म होता है, जब मोडल नष्ट हो जाता है मुझे कंसोल में निम्नलिखित त्रुटि मिलती है:

फॉर्म जमा न होने के कारण रद्द कर दिया गया

मोडल एक <modal-placeholder>तत्व में जोड़ा जाता है जो कि <app-root>मेरे शीर्ष स्तर के तत्व के लिए एक सीधा बच्चा है ।

DOM से फ़ॉर्म निकालने और Angular 2 में इस त्रुटि से छुटकारा पाने का सही तरीका क्या है? मैं वर्तमान में उपयोग करता हूंcomponentRef.destroy();



क्या आपके पास एक * एनजीआई है जो छिपाने और फॉर्म दिखाने के लिए है?
मिकदेव

@mickdev no * ngIf, मैं इस तरह से मॉडल को नष्ट कर देता componentRef.destroy();हूं, मैंने अपने प्रश्न में अधिक विवरण जोड़ दिए हैं। धन्यवाद!
निक

2
@ मिकदेव अगर मैं * एनसिफ़ का उपयोग करता हूँ तो उसे छिपाने और दिखाने के लिए क्या करना चाहिए
Jun711

जवाबों:


183

ऐसा होने के अन्य कारण भी हो सकते हैं लेकिन मेरे मामले में मेरे पास एक बटन था जिसे ब्राउज़र द्वारा सबमिट बटन के रूप में व्याख्यायित किया गया था और इसलिए जब बटन को क्लिक किया गया तो फॉर्म सबमिट हो गया। प्रकार = "बटन" जोड़ने से समस्या ठीक हो गई। पूर्ण तत्व:

    <button type="button" (click)="submitForm()">

36
मुझे यकीन नहीं है कि यह उत्तर क्यों स्वीकार किया गया था, क्योंकि ऐसा करने में, आप फ़ॉर्म सबमिट करने के लिए एंटर प्रेस करने की क्षमता खो देते हैं।
पीटर लाबांका जूल

7
नूर द्वारा उत्तर सबसे सरल है और कुंजी दर्ज करने की अनुमति देता है।
हेनर

2
इसने मेरे मुद्दे को ठीक कर दिया जहां मैं एक CANCEL बटन को उस रूप में लागू कर रहा था जिसने पृष्ठ से प्रपत्र को * ngIf निर्देश के माध्यम से हटा दिया था। मेरे पास एक SAVE बटन है, जो फ़ॉर्म को निकालने के लिए तर्क को ट्रिगर करता है (सफल सहेजें पर) लेकिन यह त्रुटि संदेश कभी भी इसके साथ दिखाई नहीं दिया, जबकि मेरे पास टाइप = 'बटन' नहीं है।
AlanObject 19

3
मेरे मामले में यह त्रुटि रद्द बटन पर हो रही थी, इसलिए यह अच्छा है कि मैंने type="button":)
मार्कोस लीमा को

मुझे लगता है कि यह उत्तर अच्छा है कि आपको अपने प्रपत्रों में स्पष्ट होना चाहिए कि कौन सा बटन सबमिट बटन है। यह प्रस्तुत करने के लिए उपयोग किए जा रहे गलत बटन के इस मुद्दे को हल करता है और साथ ही आपको सबमिशन के लिए एंटर कुंजी का उपयोग जारी रखने की अनुमति देता है।
जस्टिन

84

प्रपत्र टैग में आपको निम्नलिखित लिखना चाहिए:

 <form #myForm="ngForm" (ngSubmit)="onSubmit()">

और फॉर्म के अंदर आपको सबमिट बटन होना चाहिए:

 <button type="submit"></button>

और सबसे महत्वपूर्ण बात, अगर आपके पास आपके फॉर्म में कोई अन्य बटन है, तो आपको type="button"उन्हें जोड़ना चाहिए । डिफ़ॉल्ट छोड़ रहा हैtype विशेषता (जो मुझे लगता है submit) को चेतावनी संदेश का कारण होगा।

<button type="button"></button>

2
मुझे लगता है कि # myForm = "ngForm" की आवश्यकता नहीं है।
हेनर

आप सही हैं, जब तक कि आपको एनफोर्म के संदर्भ की आवश्यकता न हो, इसकी आवश्यकता नहीं है।
नूर

इसे हल करने का सही तरीका है। यह प्रवेश दबाकर प्रस्तुत करने की क्षमता रखते हुए संदेश से छुटकारा दिलाता है।
विलियम स्टीवंस

यह एक स्वीकृत उत्तर होना चाहिए
nt4f04und

24

तो मैं वास्तव में सिर्फ एक ही समस्या में भाग गया आज एक मॉडल शामिल किए बिना। मेरे रूप में, मेरे पास दो बटन हैं। एक जो फ़ॉर्म को सबमिट करता है और एक, जब क्लिक किया जाता है, तो पिछले पृष्ठ पर वापस जाता है।

<button class="btn btn-default" routerLink="/events">Cancel</button>
<button type="submit" class="btn btn-primary">Submit</button>

राउटरलिंक के साथ पहले बटन पर क्लिक करने पर वही होता है जो उसका माना जाता है, लेकिन जाहिर तौर पर फॉर्म को सबमिट करने की भी कोशिश करता है, और फिर फॉर्म सबमिशन को छोड़ना पड़ता है क्योंकि पेज जिस फॉर्म में था वह सबमिशन के दौरान DOM से अनमाउंट है।

यह ठीक वही बात प्रतीत होती है जो आपके साथ हो रही है, पूरे पृष्ठ के बजाय एक मोडल को छोड़कर।

समस्या तब ठीक हो जाती है जब आप सीधे दूसरे बटन के प्रकार को सबमिट के अलावा कुछ और बताते हैं।

<button type="button "class="btn btn-default" routerLink="/events">Cancel</button>

इसलिए यदि आप 'रद्द करें' बटन या किसी चीज़ के माध्यम से मोडल को बंद कर रहे हैं, तो उस बटन के प्रकार को निर्दिष्ट करते हुए, जैसा कि ऊपर दिखाया गया है, आपको अपनी समस्या को हल करना चाहिए।


6

प्रपत्र तत्व में आपको सबमिट विधि (ngSubmit) को परिभाषित करने की आवश्यकता है, कुछ इस प्रकार है: <form id="currency-edit" (ngSubmit)="onSubmit(f.value)" #f="ngForm">

और सबमिट बटन पर आप क्लिक विधि को छोड़ दें, क्योंकि आपका फॉर्म अब सबमिट विधि से जुड़ा हुआ है: <button class="btn btn-success" type="submit">Save</button>बटन सबमिट प्रकार का होना चाहिए।

घटक के पीछे कोड में आप "onSubmit" विधि को लागू करते हैं, उदाहरण के लिए कुछ इस तरह से: onSubmit(value: ICurrency) { ... } यह विधि प्रपत्र फ़ील्ड से मान के साथ एक मान ऑब्जेक्ट प्राप्त कर रहा है।


धन्यवाद, यह स्वीकृत उत्तर होना चाहिए यदि आप अभी भी अपने फॉर्म पर बटन टाइप = "सबमिट" का उपयोग करना चाहते हैं
Fjut

4

इस मामले में कि फॉर्म जमा करना घटक के नष्ट होने के साथ हो रहा है, फॉर्म सबमिट करना डोम से फॉर्म को हटाने के साथ दौड़ की स्थिति में विफल रहता है। कहो, हमारे पास है

submitForm() {
  if (this.myForm.invalid) {
    return;
  }
  this.saveData(); // processing Form data
  this.abandonForm(); // change route, close modal, partial template ngIf-destroying etc
}

यदि saveDataयह async (उदाहरण के लिए यह एपीआई कॉल के माध्यम से डेटा बचाता है) तो हम परिणाम की प्रतीक्षा कर सकते हैं:

submitForm() {
  this.saveDataAsync().subscribe(
    () => this.abandonForm(),
    (err) => this.processError(err) // may include abandonForm() call
  );
}

यदि आपको तुरंत फॉर्म छोड़ने की आवश्यकता है, तो एक शून्य-देरी का दृष्टिकोण भी काम करना चाहिए। यह फॉर्म सबमिट किए जाने के बाद अगले ईवेंट लूप में होने वाली DOM टुकड़ी की गारंटी देता है:

submitForm() {
  this.saveData();
  setTimeout(() => this.abandonForm());
}

यह बटन प्रकार की परवाह किए बिना काम करना चाहिए।


2

मुझे हाल ही में यह समस्या हुई और event.preventDefault()मेरे लिए काम किया। इसे अपनी क्लिक ईवेंट विधि में जोड़ें।

<button type="submit" (click)="submitForm($event)" mat-raised-button>Save</button>

तथा:

submitForm(event: Event) {
  event.preventDefault();
  // ...
}

2
इस उत्तर के लिए पर्याप्त विवरण नहीं है। कृपया स्पष्ट रूप से समझाएं कि यह समाधान कैसे अलग है या अन्य की तुलना में बेहतर है क्योंकि इस पोस्ट में पहले से ही कई समाधान हैं। कृपया पोस्ट करने से पहले एसओ दिशानिर्देश पढ़ें।
स्पार्कप्लग

1
@sparkplug द्वारपाल नहीं है, यह उत्तर उपयोगी था, भले ही इसके लिए अधिक विवरण की आवश्यकता हो।
विल शेवर

विल शेवर - उपयोगी, हो सकता है। अच्छी तरह से स्वरूपित और व्याख्या करना आसान है, इतना नहीं। एसओ उपयोगकर्ता को पढ़ने और समझने के लिए उत्तर सुनिश्चित करने के लिए मानक आसान हैं। @ डील्ट का उत्तर अधिक विस्तार से समाधान का एक उदाहरण है जिसका पालन करना आसान है।
स्पार्कप्लग

0

मैं इसे Angular 6 में देखता हूं, यहां तक ​​कि बिना किसी सबमिट बटन के भी। जब एक ही टेम्पलेट में कई रूप होते हैं। सुनिश्चित नहीं है कि कोई समाधान है / क्या समाधान है।



0

यदि आप अभी भी "सबमिट" प्रकार के बटन की कार्यक्षमता को बनाए रखना चाहते हैं, तो आपको उस बटन पर क्लिक इवेंट का उपयोग नहीं करना चाहिए। इसके बजाय आपको प्रपत्र पर ngSubmit ईवेंट का उपयोग करना चाहिए।

उदाहरण:

<form (ngSubmit)="destroyComponent()">
<button type="submit">submit</button>
</form>

-1

हो सकता है कि आप अपने फॉर्म सबमिशन पर किसी और पेज पर जा रहे हों। प्रोग्रामेटिक रूट नेविगेशन का उपयोग करें, जैसा कि उदाहरण routerlinkमें है जो टेम्पलेट में पास होने के बजाय निम्न है :

router.navigate(['/your/router/path'])

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.