FormControlName और FormControl में क्या अंतर है?


97

मैं ReactiveFormsModuleएक घटक बनाने के लिए Angular2 का उपयोग कर रहा हूं जिसमें एक फॉर्म शामिल है। यहाँ मेरा कोड है:

foo.component.ts :

constructor(fb: FormBuilder) {
    this.myForm = fb.group({
        'fullname': ['', Validators.required],
        'gender': []
    });
}

foo.component.html (साथ [formControl]):

<div class="fields">
    <div class="field">
        <label>Fullname*</label>
        <input type="text" [formControl]="myForm.controls.fullname"/>
    </div>
</div>

<div class="inline fields">
    <label for="gender">Gender</label>
    <div class="field">
        <div class="ui radio checkbox">
            <input type="radio" name="gender" checked="" tabindex="0" class="hidden" [formControl]="myForm.controls.gender">
            <label>Male</label>
        </div>
    </div>
    <div class="field">
        <div class="ui radio checkbox">
            <input type="radio" name="gender" tabindex="0" class="hidden" [formControl]="myForm.controls.gender">
            <label>Female</label>
        </div>
    </div>
</div>

foo.component.html (साथ formControlName):

<div class="fields">
    <div class="field">
        <label>Fullname*</label>
        <input type="text" formControlName="fullname"/>
    </div>
</div>

<div class="inline fields">
    <label for="gender">Gender</label>
    <div class="field">
        <div class="ui radio checkbox">
            <input type="radio" name="gender" checked="" tabindex="0" class="hidden" formControlName="gender">
            <label>Male</label>
        </div>
    </div>
    <div class="field">
        <div class="ui radio checkbox">
            <input type="radio" name="gender" tabindex="0" class="hidden" formControlName="gender">
            <label>Female</label>
        </div>
    </div>
</div>

दोनों तरीके काम करते हैं। लेकिन मैं यह पता नहीं लगा सकता कि उपयोग करने [formControl]और के बीच क्या अंतर है formControlName


1
मैं कहता हूँ कि formControl पर formControlName का उपयोग करने का मुख्य कारण यह है कि आप घटक में अलग-अलग FormControl उदाहरणों को बनाए रखना नहीं चाहते हैं।
पॉल समसोथा

जवाबों:


177

मेरा मानना ​​है कि आप एक महत्वपूर्ण बिंदु से चूक गए: [formGroup]दूसरे उदाहरण में निर्देश। आपके फॉर्म के कई डॉट नेवीगेशन को बचाने के लिए formControlNameएक साथ उपयोग किया जाता है [formGroup]। उदाहरण के लिए:

<div>
  <input type="text" [formControl]="myForm.controls.firstName"/>
  <input type="text" [formControl]="myForm.controls.lastName"/>
  <input type="text" [formControl]="myForm.controls.email"/>
  <input type="text" [formControl]="myForm.controls.title"/>
</div>

के बराबर है:

<div [formGroup]="myForm">
  <input type="text" formControlName="firstName"/>
  <input type="text" formControlName="lastName"/>
  <input type="text" formControlName="email"/>
  <input type="text" formControlName="title"/>
</div>

अब नेस्टेड की कल्पना करें FormGroups:)


[formControl] = "form.get ('Registration.Attributes.aboutme')" के कारण समस्याओं का उपयोग कर .. लेकिन formControlName = "firstNRegistration.Attributes.aboutmeame
Ricardo Saracino

[formControl]form.validफॉर्मग्रुप के साथ सत्यापन के दौरान समस्या का कारण , कोई टिप्पणी
जैन

अगर इनपुट एलेंट एक अन्य घटक है तो मैं कैसे संभाल सकता हूं। मैं कैसे घटक withe fomrcontrol बाँध कर
रमाकांत रेड्डी

20

[formControl]FormControlआपके द्वारा बनाए गए इंस्टेंस का संदर्भ देता है FormControlDirective

formControlName नाम द्वारा नियंत्रण देखने के लिए प्रपत्र मॉड्यूल के लिए एक स्ट्रिंग प्रदान करता है।

यदि आप नियंत्रण के लिए वैरिएबल बनाते हैं, तो आपको .हैरी द्वारा बताए गए अनुसार की आवश्यकता नहीं है , लेकिन मैं [formGroup]इसके बजाय उपयोग करने का सुझाव दूंगा क्योंकि अधिक जटिल रूपों के साथ यह गड़बड़ हो सकता है।

constructor(fb: FormBuilder) {
    this.fullName = new FormControl('', Validators.required);
    this.gender = new FormControl('');
    this.myForm = fb.group({
        'fullname': this.fullName,
        'gender': this.gender
    });
}

जब मैं इसे जोड़ता हूं। मुझे एक त्रुटि मिली जैसे आप असाइन नहीं कर सकते क्योंकि यह केवल-केवल संपत्ति या स्थिरांक है, लेकिन यहां मुझे एक चर के रूप में लिया गया है। कृपया मदद करें
user8478

1
कृपया सटीक त्रुटि संदेश पोस्ट करें । यह संभवतः एक नया प्रश्न बनाने के लिए बेहतर है जिसमें आपका कोड है जो पुन: पेश करने की अनुमति देता है
गुंटर ज़ोचौएर

7

स्वीकृत उत्तर में दिए गए दो के लिए एक 3 तुल्यता है, जो यह है (अनुशंसित नहीं):

<div [formGroup]="myForm">
  <input type="text" [formControl]="firstName"/>
  <input type="text" [formControl]="lastName"/>
  <input type="text" [formControl]="email"/>
  <input type="text" [formControl]="title"/>
</div>

ध्यान दें कि हम अभी भी [formGroup] निर्देश का उपयोग कर रहे हैं।

हालाँकि, इस टेम्पलेट को त्रुटि के बिना संकलित करने के लिए, फिर आपके घटक को कंट्रक्शन कंट्रोल्स के रूप में नियंत्रण की घोषणा करने की आवश्यकता है न कि फॉर्मकंट्रोल:

myComponent.ts

firstName: AbstractControl
lastName: AbstractControl
email: AbstractControl
title: AbstractControl

हालांकि, कृपया ध्यान दें कि AbstractControls की घोषणा करने की अनुशंसा नहीं की जाती है , इसलिए यदि आपको त्रुटि मिलती है, Cannot find control with unspecified name attributeतो यह संभव है कि आपने शैलियों को मिलाया है या आपके नियंत्रण को AbstractControls घोषित किया है।


अगर इनपुट एलेंट एक अन्य घटक है तो मैं कैसे संभाल सकता हूं। मैं कैसे घटक withe fomrcontrol बाँध कर
रमाकांत रेड्डी

आप नहीं कर सकते हैं - यहां तक ​​कि अगर कोई रास्ता है, तो आपको नहीं करना चाहिए। तत्व को उस घटक में परिभाषित नियंत्रण के लिए बाध्य होना चाहिए। यदि आप किसी अन्य घटक को डेटा पास करना चाहते हैं, तो एक सेवा का उपयोग करें (या यदि यह मूल घटक है तो घटना emitter)। Google घटकों के बीच डेटा कैसे पास करे
rmcsharry

क्या आप कृपया इस पोस्ट को देख सकते हैं stackoverflow.com/questions/58100248/…
रमाकांत रेड्डी 14

2

कोणीय डॉक्स ( https://angular.io/guide/reactive-forms ) से:

अंग

@Component({
  ...
})
export class ProfileEditorComponent {
  profileForm = new FormGroup({
    firstName: new FormControl(''),
    lastName: new FormControl(''),
  });
}

खाका

<form [formGroup]="profileForm">

  <label>
    First Name:
    <input type="text" formControlName="firstName">
  </label>

  <label>
    Last Name:
    <input type="text" formControlName="lastName">
  </label>

</form>

ध्यान दें कि जैसे ही FormGroupनियंत्रण का एक समूह होता है, प्रोफ़ाइलफ़ॉर्म निर्देश के FormGroupसाथ फार्म तत्व से बाध्य FormGroupहोता है, मॉडल और इनपुट युक्त प्रपत्र के बीच संचार परत बनाता है। formControlNameद्वारा प्रदान की इनपुट FormControlNameनिर्देश में परिभाषित प्रपत्र नियंत्रण करने के लिए प्रत्येक व्यक्ति के इनपुट बांधताFormGroup


1

साथ [formControl]क्योंकि आप रिएक्टिव प्रोग्रामिंग फायदे का उपयोग कर सकते FormControlएक संपत्ति नामक valueChangesजो एक रिटर्न (मैं अभी इस एक पता है, शायद वहाँ है कि तुलना में अधिक है) Observableजो आप सदस्यता और इसका इस्तेमाल कर सकते हैं। (उदाहरण के लिए, यह उन रजिस्टर परिदृश्यों में बहुत उपयोगी है, जिन्हें आप इनपुट ईमेल की जाँच करना चाहते हैं, जैसे ही उपयोगकर्ता मान को बदलता है, दोहराया नहीं जाता है)


हाँ। लेकिन आप अपने जवाब में मॉडल का उपयोग करते समय भी टेम्पलेट में फॉर्मकंट्रोलनाम का उपयोग करते हैं। बस FormControlName = "someFormControlName" को कुछFormControlName जैसे घटक.ts फ़ाइल में FormControl के लिए असाइन करें: FormControl;
चार्ल्स रॉबर्टसन
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.