2017-08-13 9 views
23

मेरे पास मेरे फॉर्म के साथ एक छोटी सी जांच है।कोणीय 4 - फॉर्म नियंत्रण के लिए कोई मूल्य एक्सेसर

<div formControlName="surveyType"> 
    <div *ngFor="let type of surveyTypes" 
     (click)="onSelectType(type)" 
     [class.selected]="type === selectedType"> 
    <md-icon>{{ type.icon }}</md-icon> 
    <span>{{ type.description }}</span> 
    </div> 
</div> 

मैं formControlName जोड़ने का प्रयास करते हैं, लेकिन कोणीय न कुछ भी जानना चाहता हूँ और बस कह रही::

ERROR Error: No value accessor for form control with name: 'surveyType' 

मैं सफलता के बिना ngDefaultControl जोड़ने की कोशिश की

मैं एक कस्टम तत्व था। ऐसा लगता है क्योंकि कोई इनपुट/चयन नहीं है ... लेकिन मुझे नहीं पता कि क्या करना है।

मैं इस फॉर्म पर अपने क्लिक को बाध्य करना चाहता हूं ताकि जब कोई व्यक्ति पूरे कार्ड पर क्लिक करे जो मेरे 'प्रकार' को फॉर्म कंट्रोल में दबाए। क्या यह संभव है?

+0

आप हिस्सा "formControl में मेरी 'प्रकार' धक्का" कृपया समझा सकते हैं? – Vega

+0

मुझे नहीं पता कि मेरा बिंदु यह है कि: formControl HTML में फॉर्म नियंत्रण के लिए जाता है लेकिन div एक फॉर्म नियंत्रण नहीं है। मैं अपने सर्वेक्षण को टाइप करना चाहता हूं टाइप करें। मेरे कार्ड div – jbtd

+0

के टाइप.आईडी के साथ टाइप करें यदि आपके पास इनपुट नहीं है तो आपको फ़ॉर्म और फॉर्म कंट्रोल की आवश्यकता क्यों होगी? क्या आपको कार्ड नियंत्रक पर क्लिक करने की आवश्यकता नहीं है, अपने नियंत्रक में कार्ड जानकारी प्राप्त करें? – Vega

उत्तर

35

पर नहीं एक input पर formControlName="surveyType" का उपयोग करना चाहिए आप केवल ऐसे निर्देश हैं जो ControlValueAccessor लागू पर formControlName उपयोग कर सकते हैं।

इंटरफ़ेस को लागू

तो, आदेश तुम क्या चाहते करने के लिए, आप एक घटक है जो ControlValueAccessor लागू करता है, जो निम्नलिखित तीन कार्यों को लागू करने का मतलब है बनाने के लिए:

  • writeValue (बताता है कोणीय से मॉडल को मूल्य में कैसे लिखना है)
  • registerOnChange (एक हैंडलर फ़ंक्शन पंजीकृत करता है जिसे दृश्य में बदलते समय कहा जाता है)
  • registerOnTouched (जब घटक को टच इवेंट प्राप्त होता है, तो घटक को ध्यान केंद्रित करने के लिए उपयोगी होने पर एक हैंडलर को कॉल किया जाता है)।

फिर एक प्रदाता

रजिस्टर, आप कोणीय बताने के लिए है कि इस निर्देश एक ControlValueAccessor है (इंटरफेस वाला कटौती यह बाद से यह कोड से छीन लिया जाता है, जब टाइपप्रति जावास्क्रिप्ट को संकलित किया गया है नहीं है)। आप इसे द्वारा प्रदाता पंजीकृत करते हैं।

प्रदाता NG_VALUE_ACCESSOR और use an existing value प्रदान करना चाहिए। आपको यहां forwardRef की भी आवश्यकता होगी। ध्यान दें कि NG_VALUE_ACCESSORmulti provider होना चाहिए।

providers: [ 
    { 
    provide: NG_VALUE_ACCESSOR, 
    multi: true, 
    useExisting: forwardRef(() => MyControlComponent), 
    } 
] 

प्रयोग

आपका घटक तैयार है इस्तेमाल किया जा रहा:

उदाहरण के लिए, यदि अपने कस्टम निर्देश MyControlComponent नाम पर है, आप कुछ निम्नलिखित लाइनों के साथ वस्तु @Component डेकोरेटर के लिए पारित अंदर जोड़ना चाहिए । template-driven forms के साथ, ngModel बाध्यकारी अब ठीक से काम करेगा।

reactive forms के साथ, अब आप formControlName का उचित उपयोग कर सकते हैं और फॉर्म नियंत्रण अपेक्षित व्यवहार करेगा।

संसाधन

+0

अच्छा! यह उसके साथ ठीक होना चाहिए। Thx :) मैं यह कोशिश करने जा रहा हूँ और मैं आपको सूचित रखता हूँ। – jbtd

+0

यह काम करता है, मैं नियंत्रण मूल्य एक्सेसर के साथ एक घटक बना देता हूं और अब यह काम करता है जैसे मैं चाहता था! धन्यवाद @Lazar Ljubenović – jbtd

+2

उपरोक्त! मेरे लिए कई बार उपयोगी हो गया, धन्यवाद @ लाज़र: डी –

6

मुझे लगता है कि आप और एक div

+0

हाँ यकीन है, लेकिन मुझे नहीं कैसे कुछ और है जो एक एचटीएमएल प्रपत्र नियंत्रण – jbtd

+0

CustomValueAccessor की बात कुछ भी करने के प्रपत्र नियंत्रण जोड़ना है हो जाएगा, यहां तक ​​कि एक div – SoEzPz

+2

OMG भाई में मेरा कार्ड div चालू करने के लिए जानते हैं कि यह था सबसे उपयोगी जवाब। धन्यवाद, मुझे यह नहीं पता है। – George

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