मेरे कोणीय (4 + टाइपस्क्रिप्ट) प्रोजेक्ट के अंदर मैंने पहले ही तैयार घटक का उपयोग किया था (यह वास्तव में कोई फर्क नहीं पड़ता कि नियंत्रणवैल्यूएक्सर को विस्तारित करने के तरीके के बाद से यह वास्तव में कोई फर्क नहीं पड़ता है, लेकिन यदि यह मायने रखता है ng2-select) जो मैं बेहतर यूएक्स और अच्छे दिखने के कारण चाहता था। उस पर, मेरे प्रपत्र घटक है जो प्रतिक्रियाशील रूपों मैंने देखा उपयोग कर रहा है के लिए यह सहित के बाद प्रस्तुत मैं वापस (प्रपत्र नियंत्रण के लिए) वस्तु वर्ग SelectItem जो चयनित आइटम (रों) का प्रबंधन करने के लिए तैयार घटक के अंदर प्रयोग किया जाता है, के आधार पर मिलता है - इस तरह:एंगुलर 4 कंट्रोल वैल्यूएक्फरर मूल्य सबमिट और वैल्यू चेंज इवेंट्स
// console.log(this.myForm.values)
Object {
txtInput: 'value',
// ...
preparedComponent: SelectItem { // <--
id: '1',
text: 'Chosen item'
}
}
के बाद से घटक मूल रूप से सिर्फ मानक का चयन करें नियंत्रण, मैं उम्मीद कर रहा था कि मैं वापस स्ट्रिंग के रूप में गठन चुने गए आइटम का एक आईडी मिल जाएगा के लिए एक स्थानापन्न है - इस तरह:
// console.log(this.myForm.values)
Object {
txtInput: 'value',
// ...
preparedComponent: '1' // <--
}
मैं के बाद सीखा क्या वास्तव में ControlValueAccessor है और यह कैसे काम करता है, मैं आइटम परिवर्तन पर कहने के लिए क्या पीठ पर प्रस्तुत आता है (या बेहतर का तरीका ही बदल - +०१२३२५५६६५५) किसी आइटम की आईडी पर। कुछ समय तक समस्या हल हो गई जब तक कि मैंने रिक्त मानों (उदाहरण जोड़ने पर) के बजाय नियंत्रण बनाने के लिए पूर्वनिर्धारित मान (संपादन उदाहरण पर) सेट करना प्रारंभ किया। मैं पता लगा है कि इस बार writeValue
मान निर्दिष्ट है यह पूर्वनिर्धारित मूल्य के रूप में यह करने के लिए भेज दिया जाता है, उसके आधार पर नियंत्रण के रूप में। मामले कि मैं के रूप में पूर्वनिर्धारित मूल्य भेजा में तो ...
Object {
id: '1',
text: 'Chosen item'
}
... यह भी था बस ऊपर पहले कोड उदाहरण के रूप में प्रस्तुत पर वस्तु में मूल्य। मैं writeValue
कहा जाता है के बाद onChange
अधिकार के साथ नियंत्रित करने के लिए सही मान देना इस बात के लिए एक समाधान बनाया है। यह बात करने का वास्तव में अनुचित तरीका था, लेकिन मुझे लगता है कि के अलावा और कुछ पता लगा नहीं कर सकता:
public writeValue(val: any): void {
this.selectedItems = val; // val is for example Object { id: '1', text: 'Chosen item' }
setTimeout(() => {
this.onChange(val.id); // just an example of emitted value, there should be some checks val is object and id exists in real code
}, 0);
}
और वह भी जहाँ तक काम किया, जैसा कि मैंने नियंत्रण के valueChanges
फार्म की सदस्यता के साथ शुरू नहीं किया। समस्या तैयार घटक करने के लिए पूर्वनिर्धारित मूल्य के प्रत्येक बताए साथ, वहाँ भी बाद इस्तेमाल सबमिट करते हैं, वापस ग्राहकों के लिए भी जब { emitEvent: false }
का उपयोग कर मूल्य का एक फेंकना है।
तो यह वही चीजें हैं जिन्हें मैं किसी भी तरह से तैयार घटक के साथ संभालना चाहता हूं, क्योंकि मैं सबमिट पर नियंत्रण से सही मूल्य प्राप्त करना चाहता हूं और मैं ग्राहकों को तब तक बदलना नहीं चाहता जब तक कि मूल्य वास्तव में नहीं बदला जाता, न केवल पूर्वनिर्धारित मान के रूप में प्रतिस्थापित किया गया। इस बात को संभालने का कोई विचार सराहना की जाएगी।
मैं थोड़े इस सटीक प्रक्रिया के माध्यम से चला गया। मुझे बिल्कुल यकीन नहीं है कि मैं आपकी सटीक समस्या को समझता हूं। – Amit
समस्या मुख्य रूप से 'writeValue' के अंदर 'ऑन चेंज' के साथ है। सबसे पहले, क्योंकि 'setTimeout' जो वास्तव में अंत में मैं एक समाधान के रूप करते हैं और होता है दूसरी बात, क्योंकि यह परिवर्तन घटना जब पूर्वनिर्धारित मूल्य के साथ प्रारंभ उत्सर्जन करता है। आदर्श रूप से इनपुट और आउटपुट मान अलग किए जाएंगे - इनपुट ऑब्जेक्ट स्वीकार करेगा और आउटपुट चयनित ऑब्जेक्ट की आईडी वापस करेगा। 'नियंत्रण से setValue' पर' या फार्म 'reset' कोणीय घटना उत्सर्जन नहीं: क्योंकि यह नहीं है एक (डिफ़ॉल्ट व्यवहार के रूप उम्मीद करेंगे क्या' {झूठी emitEvent} के मामले में इसलिए, परिवर्तन मूल्य init पर उत्सर्जन के लिए कोई जरूरत नहीं है जब मूल्य chaning)। – user1257255
मैं बहुत विश्वास है इस एक मुद्दे के अधिक है क्योंकि आप कर रहे है कर रहा हूँ (और मैं भी है) "फाइटिंग" NG2 का चयन करें (जो मुश्किल से btw बनाए रखा है) – Amit