औपचारिक रूप से नियंत्रण के लिए मैन्युअल रूप से सेट मान


175

यह मुझे पागल कर रहा है, मैं बंदूक के नीचे हूं और इस पर एक और पूरा दिन बिताने का जोखिम नहीं उठा सकता।

मैं मैन्युअल रूप से घटक के भीतर एक नियंत्रण मूल्य ('विभाग') सेट करने का प्रयास कर रहा हूं, और यह ठीक से काम नहीं कर रहा है - यहां तक ​​कि नया मान भी ठीक से कंसोल करने के लिए लॉग करता है।

यहाँ फॉर्मब्यूलर इंस्टेंस है:

initForm() {
  this.form = this.fb.group({
    'name': ['', Validators.required],
    'dept': ['', Validators.required],
    'description': ['', Validators.required],
  });
}

यह ईवेंट हैंडलर है जो चयनित विभाग को प्राप्त करता है:

deptSelected(selected: { id: string; text: string }) {
  console.log(selected) // Shows proper selection!

  // This is how I am trying to set the value
  this.form.controls['dept'].value = selected.id;
}

अब जब फॉर्म जमा हो गया है और मैं लॉग आउट this.formकरता हूं तो फील्ड अभी भी खाली है! मैंने अन्य पीपीएल का उपयोग देखा है, updateValue()लेकिन यह बीटा 1 है और मैं इसे नियंत्रण पर कॉल करने के लिए एक वैध विधि के रूप में नहीं देखता हूं।

मैंने भी updateValueAndValidity()बिना किसी सफलता के फोन करने की कोशिश की है :(।

मैं सिर्फ ngControl="dept"फॉर्म एलिमेंट पर उपयोग करूंगा , जैसे कि मैं बाकी फॉर्म के साथ कर रहा हूं, लेकिन इसका कस्टम डायरेक्शन / कंपोनेंट है।

<ng-select
  [data]="dept"
  [multiple]="false"
  [items]="depts"
  (selected)="deptSelected($event)" <!-- This is how the value gets to me -->
  [placeholder]="'No Dept Selected'"></ng-select>

मैं इसी तरह की स्थिति में चला गया था, यह मान था कि मान http.get-सदस्यता में सेट किया गया था और फ़ॉर्म मूल्य को लोड किया गया था, लेकिन मूल्य पंक्ति को पहले निष्पादित किया जा रहा है, सदस्यता वास्तव में इसके अतुल्यकालिक के रूप में बाद में निष्पादित हो जाती है। इसलिए सदस्यता में मान सेट करना सुनिश्चित करें कि उसका सेट। my2cents!
हाइडेची

जवाबों:


325

अपडेट किया गया: 19/03/2017

this.form.controls['dept'].setValue(selected.id);

पुराना:

अभी के लिए हम एक प्रकार कास्ट करने के लिए मजबूर हैं:

(<Control>this.form.controls['dept']).updateValue(selected.id)

बहुत सुंदर नहीं हूँ मैं सहमत हूँ। आशा है कि यह भविष्य के संस्करणों में सुधार होगा।


6
यह अच्छी तरह से काम करता है, धन्यवाद। सत्यापन को भी स्पष्ट करने की आवश्यकता है: (<Control>this.form.controls['dept']).setErrors(null)
मैन कॉल हनी

17
या अभी तक this.form.get('dept').setValue(selected.id):)
डेवलपर

6
सिर्फ एक नोट। आप इंडेक्सर के बिना भी सीधे संपत्ति तक पहुंच सकते हैं। this.form.controls.dept.setValue(selected.id);
जेम्स पौलोज

लेकिन यह नए डेटा के लिए सत्यापन निष्पादित नहीं करेगा !! अद्यतन करने के बाद मैन्युअल रूप से परिवर्तन का पता लगाने को कैसे ट्रिगर करें?
ksh

1
यह मेरे लिए 2019 है यह काम करता है:this.form.controls['dept'].setValue(selected.id);
जॉन लोपेज

98

कोणीय 2 फाइनल (RC5 +) में फॉर्म वैल्यू अपडेट करने के लिए नए एपीआई हैं। patchValue()एपीआई विधि आंशिक रूप अद्यतन, जहां हम केवल क्षेत्रों के कुछ निर्दिष्ट करने की आवश्यकता का समर्थन करता है:

this.form.patchValue({id: selected.id})

setValue()एपीआई विधि भी है जिसमें सभी फॉर्म फ़ील्ड के साथ एक ऑब्जेक्ट की आवश्यकता होती है। यदि कोई फ़ील्ड गुम है, तो हमें एक त्रुटि मिलेगी।


7
बस जोड़ने के लिए अब के रूप में updateValue(फ़िलोके द्वारा स्वीकृत जवाब से) के पक्ष में पदावनत किया जा रहा हैsetValue
सुपरजोस

2
यहाँ गितुब और पदावनत करने और प्रस्तुत करने और के लिए औचित्य पर आधिकारिक पुल अनुरोध हैupdateValue()patchValuesetValue
TheBrockEllis

लेकिन यह नए डेटा के लिए सत्यापन निष्पादित नहीं करेगा !! अद्यतन करने के बाद मैन्युअल रूप से परिवर्तन का पता लगाने को कैसे ट्रिगर करें
ksh

16

Aangular 2 फाइनल में एपीआई अपडेट किए गए हैं। उन्होंने इसके लिए कई तरीके जोड़े हैं।

नियंत्रक से प्रपत्र नियंत्रण को अद्यतन करने के लिए ऐसा करें:

this.form.controls['dept'].setValue(selected.id);

this.form.controls['dept'].patchValue(selected.id);

त्रुटियों को रीसेट करने की आवश्यकता नहीं है

संदर्भ

https://angular.io/docs/ts/latest/api/forms/index/FormControl-class.html

https://toddmotto.com/angular-2-form-controls-patch-value-set-value


दोनों के बीच अंतर - setValue()जब एक पर बुलाया जाता है formGroup/formBuilder, तो इसे सेट किए जाने वाले फॉर्म के तहत सभी मूल्यों की आवश्यकता होती है। patchValue(), जब उसी पर कॉल किया जाता है, तो इसका उपयोग विशिष्ट मूल्यों को अपडेट करने के लिए किया जा सकता है।
विभोर दुबे

11

प्रतिक्रियाशील प्रपत्र नियंत्रण के मान को अद्यतन करने के लिए आप निम्न विधियों का उपयोग कर सकते हैं। निम्न में से कोई भी तरीका आपकी आवश्यकता के अनुरूप होगा।

सेटवैल्यू () का उपयोग करने के तरीके

this.form.get("dept").setValue(selected.id);
this.form.controls["dept"].setValue(selected.id);

पैचवॉल () का उपयोग करने के तरीके

this.form.get("dept").patchValue(selected.id);
this.form.controls['dept'].patchValue(selected.id);
this.form.patchValue({"dept": selected.id});

अंतिम विधि रूप में सभी नियंत्रणों को पूरी तरह से लूप कर देगी इसलिए एकल नियंत्रण को अद्यतन करते समय इसे प्राथमिकता नहीं दी जाती है

आप ईवेंट हैंडलर के अंदर किसी भी विधि का उपयोग कर सकते हैं

deptSelected(selected: { id: string; text: string }) {
     // any of the above method can be added here
}

यदि आवश्यक हो तो आप प्रपत्र समूह में कई नियंत्रण अपडेट कर सकते हैं

this.form.patchValue({"dept": selected.id, "description":"description value"});

9

आप यह कोशिश कर सकते हैं:

deptSelected(selected: { id: string; text: string }) {
  console.log(selected) // Shows proper selection!

  // This is how I am trying to set the value
  this.form.controls['dept'].updateValue(selected.id);
}

अधिक जानकारी के लिए, आप updateValueविधि के दूसरे पैरामीटर के बारे में संबंधित JS Doc पर एक नज़र डाल सकते हैं : https://github.com/angular/angular/blob/master/modules/angular2/src/common/forms/model। # L269 टीएस


आपके उत्तर के लिए धन्यवाद - हालाँकि updateValue को angular2 beta.1 में एक मान्य विधि नहीं लगती है - आप किस संस्करण पर हैं कि आप उस पद्धति का उपयोग करने में सक्षम हैं?
मैथ्यू ब्राउन

1
टाइपस्क्रिप्ट निम्नलिखित त्रुटि देता है error TS2339: Property 'updateValue' does not exist on type 'AbstractControl':। उस घटक में, प्रपत्र का प्रकार है ControlGroup। शायद अगर मैं उन्हें व्यक्तिगत रूप से बनाऊं तो new Control()यह काम करेगा
मत्ती ब्राउन

5

इनमें से किसी ने मेरे लिए काम नहीं किया। मुझे करना था:

  this.myForm.get('myVal').setValue(val);

मेरे साथ भी ऐसा ही हुआ। यह एक केस क्यों है?
रहमानली मोमिन

3
  let cloneObj = Object.assign({}, this.form.getRawValue(), someClass);
  this.form.complexForm.patchValue(cloneObj);

यदि आप मैन्युअल रूप से प्रत्येक फ़ील्ड सेट नहीं करना चाहते हैं।


2

@ Filoche के कोणीय 2 अद्यतन समाधान। का उपयोग करते हुएFormControl

(<Control>this.form.controls['dept']).updateValue(selected.id)

import { FormControl } from '@angular/forms';

(<FormControl>this.form.controls['dept']).setValue(selected.id));

वैकल्पिक रूप से आप @ AngularUniversity के समाधान का उपयोग कर सकते हैं जो उपयोग करता हैpatchValue


1

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

एक उदाहरण के रूप में इसका उपयोग करने के लिए आपकी फ़ॉर्म संरचना इतनी सही है। इसलिए, अपने उत्तर के दौरान मैं इसे रूप के रूप में निरूपित करूंगा।

this.form = this.fb.group({
    'name': ['', Validators.required],
    'dept': ['', Validators.required],
    'description': ['', Validators.required]
  });

इसलिए हमारा फॉर्म एक फॉर्मग्रुप प्रकार की वस्तु है जिसमें तीन फॉर्मकंट्रोल हैं

मॉडल मान को अद्यतन करने के दो तरीके हैं:

  • व्यक्तिगत नियंत्रण के लिए एक नया मान सेट करने के लिए setValue () विधि का उपयोग करें। सेटवैल्यू () विधि कड़ाई से फार्म समूह की संरचना का पालन करती है और नियंत्रण के लिए पूरे मूल्य को प्रतिस्थापित करती है।

  • पैचवॉल्यू () विधि का उपयोग उस ऑब्जेक्ट में परिभाषित किसी भी गुण को बदलने के लिए करें जो फॉर्म मॉडल में बदल गया है।

SetValue () विधि की सख्त जाँच जटिल रूपों में नेस्टिंग त्रुटियों को पकड़ने में मदद करती है, जबकि पैचवैल्यू () उन त्रुटियों पर चुपचाप विफल हो जाती है।

कोणीय आधिकारिक दस्तावेज से यहां

इसलिए, जब एक समूह समूह उदाहरण के लिए मान को अपडेट किया जाता है जिसमें कई नियंत्रण होते हैं, लेकिन आप केवल मॉडल के कुछ हिस्सों को अपडेट करना चाहते हैं। पैचवैल्यू () वह है जिसे आप ढूंढ रहे हैं।

उदाहरण देखते हैं। जब आप पैचवैल्यू () का उपयोग करते हैं

this.form.patchValue({
    dept: 1 
});
//here we are just updating only dept field and it will work.

लेकिन जब आप setValue () का उपयोग करते हैं, तो आपको पूर्ण मॉडल को अपडेट करने की आवश्यकता होती है क्योंकि यह प्रपत्र समूह की संरचना का कड़ाई से पालन करता है। इसलिए, अगर हम लिखते हैं

this.form.setValue({
    dept: 1 
});
// it will throw error.

हमें फॉर्म समूह मॉडल के सभी गुणों को पास करना होगा। इस तरह

this.form.setValue({
      name: 'Mr. Bean'
      dept: 1,
      description: 'spome description'
  });

लेकिन मैं अक्सर इस शैली का उपयोग नहीं करता। मैं निम्नलिखित दृष्टिकोण का उपयोग करना पसंद करता हूं जो मेरे कोड क्लीनर और अधिक समझने में मदद करता है।

मैं क्या करता हूं, मैं सभी नियंत्रणों को एक अलग चर के रूप में घोषित करता हूं और उस विशिष्ट नियंत्रण को अपडेट करने के लिए सेटवैल्यू () का उपयोग करता हूं।

उपरोक्त फॉर्म के लिए, मैं ऐसा कुछ करूँगा।

get companyIdentifier(): FormControl {
    return this.form.get('name') as FormControl;
}

get dept(): FormControl {
    return this.form.get('dept') as FormControl;
}

get description(): FormControl {
    return this.form.get('description') as FormControl;
}

जब आपको प्रपत्र नियंत्रण को अपडेट करने की आवश्यकता होती है, तो इसे अद्यतन करने के लिए केवल उस संपत्ति का उपयोग करें। जब उपयोगकर्ता ड्रॉप डाउन सूची से किसी आइटम का चयन करता है, तो उदाहरण में प्रश्नकर्ता ने विभाग के नियंत्रण को अद्यतन करने का प्रयास किया।

deptSelected(selected: { id: string; text: string }) {
  console.log(selected) // Shows proper selection!

  // instead of using this.form.controls['dept'].setValue(selected.id), I prefer the following.

  this.dept.setValue(selected.id); // this.dept is the property that returns the 'dept' FormControl of the form.
}

मैं सुझाव देता हूं कि फॉर्मग्राफ की सभी संपत्तियों और तरीकों के बारे में जानने के लिए फॉर्मग्राफ एपीआई देखें।

अतिरिक्त : गेटटर के बारे में जानने के लिए यहां देखें


1

यदि आप प्रपत्र नियंत्रण का उपयोग कर रहे हैं तो ऐसा करने का सबसे सरल तरीका:

this.FormName.get('ControlName').setValue(value);

-1

युक्ति: यदि आप उपयोग कर रहे हैं, setValueलेकिन आपको प्रत्येक संपत्ति प्रदान नहीं कर रहे हैं तो आपको एक त्रुटि मिलेगी:

Must supply a value for form control with name: 'stateOrProvince'.

इसलिए आपको उपयोग करने के लिए लुभाया जा सकता है patchValue, लेकिन यह खतरनाक हो सकता है यदि आप एक संपूर्ण फ़ॉर्म को अपडेट करने का प्रयास कर रहे हैं। मेरे पास ऐसा addressहै stateOrProvinceया नहीं या stateCdयह निर्भर करता है कि यह अमेरिका है या दुनिया भर में है।

इसके बजाय आप इस तरह से अपडेट कर सकते हैं - जो नल को चूक के रूप में उपयोग करेगा:

this.form.setValue( { stateOrProvince: null, stateCd: null, ...address } );
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.