मुझे एक बहुत ही साधारण समस्या मिली है जिसका समाधान बिल्कुल आसान नहीं है।
मैं selectfield
के प्रत्येक विकल्प के सामने छवियां जोड़ना चाहता हूं। अधिक सटीक होने के लिए, मैं छवियों को picker
में ट्रिगर्स और चुनिंदा फ़ील्ड के वर्तमान मान में जोड़ना चाहता हूं।
सादगी के लिए, मैं एक छोटे से उदाहरण बना देंगे:सेन्चा टच चयन क्षेत्र में पॉपुलटिंग आइकन
मान लें, आप एक उपयोगकर्ता चार खेल कार्ड सूट हीरे, दिल, हुकुम और क्लब में से एक के बीच चयन करना चाहते हैं। दृश्य पहचान के समर्थन के लिए, आप प्रत्येक सूट नाम करने के लिए इसी प्रतीक पहले जोड़ें करना चाहते हैं, तो यह कुछ इस तरह दिखाई दे सकता है:
एक Sencha स्पर्श घटक के मेरी पहली पसंद, कि विकल्पों में से एक सेट से चयन सक्षम स्वाभाविक रूप से selectfield
था। दुर्भाग्यवश, यह केवल शुद्ध पाठ प्रदर्शित करने में सक्षम है, और कुछ भी नहीं। सेन्चा टच स्रोतों में खुदाई करने के बाद, मैं अंत में आधे समाधान के साथ आया। असल में, मैं selectfield
एक कस्टम defaultPhonePickerConfig
पास करता हूं, जिसमें संबंधित picker
(जिसे विकल्प प्रदर्शित करने के लिए selectfield
द्वारा उपयोग किया जाता है) को कस्टम itemTpl
असाइन किया जाता है। itemTpl
आराम करता है, अर्थात् छवि प्रदर्शित करने कुछ html जोड़ने:
defaultPhonePickerConfig: {
listeners: {
initialize: function() {
var slots = this.query('pickerslot');
Ext.each(slots, function(slot) {
slot.setItemTpl('<img src="someImage.jpg"> {text}');
});
},
change: function() {
// reconstruct the selectfield's change handler,
// since it gets overwritten
var iconSelect = Ext.Viewport.query('#IconSelect')[0];
iconSelect.onPickerChange.apply(iconSelect, arguments);
}
}
}
इस समाधान के लिए एक काम कर बेलाhere पाया जा सकता है।
मेरे समाधान है कि बुरा नहीं है, लेकिन वहाँ एक मामूली cosmetical समस्या है, यह सिर्फ मेरे लिए स्वीकार्य नहीं है: माउस केवल picker
(ऊपर स्क्रीनशॉट के निचले हिस्से) में प्रदर्शित किए जाते हैं, लेकिन नहींselectfield
ही (ऊपरी, ग्रेड आउट भाग) जब विकल्प चुना गया था। और चुनिंदा क्षेत्र के वर्तमान मूल्य में आइकन जोड़ने का कोई अच्छा तरीका नहीं लगता है।
और यह मेरे प्रश्न का मुख्य विषय है: पर दोनों को जोड़ने के लिए क्या अच्छा तरीका है पिकर के विकल्प और सेलेकफील्ड के वर्तमान मूल्य पर भी? क्या मुझे शायद अपने मौजूदा समाधान में अपेक्षाकृत कम कोड जोड़ना है या क्या मुझे पूरा नोटर दृष्टिकोण लेना चाहिए?
प्रत्येक योगदान की सराहना की जाती है। धन्यवाद!
अद्यतन:
आसपास हैकिंग कुछ के बाद, मैं एक तरह से (एक बदसूरत एक) selectfield
खुद के लिए एक आइकन पहले जोड़ें करने के लिए मिला। यह ज्यादातर क्रूर एचटीएमएल डोम मैनिपुलेशन पर आधारित है: अब मैं selectfield
के लिए ईवेंट हैंडलर को भी परिभाषित करता हूं (change
और painted
)। प्रारंभिकरण पर और जब भी मूल्य बदल जाता है, तो मेरे हैंडलर अंतर्निहित <input>
के लिए उत्पन्न डीओएम खोजते हैं और इसके साथ गड़बड़ करते हैं। (वह बुरे लड़का शायद यही कारण है कि हम HTML को पहले स्थान पर असाइन नहीं कर सकते हैं, क्योंकि ढांचे में value
विशेषता बदलती है। और value
दूसरी तरफ केवल सादा पाठ हो सकता है।)
यह वह जगह है मैं कैसे परिभाषित selectfield
के listeners
:
prependIconToSelectfield: function (optValue, domElement) {
var iconUrl = this.getIconUrl(optValue);
domElement.style.backgroundImage = 'url(' + iconUrl + ')';
domElement.style.backgroundSize = '20px 20px';
domElement.style.backgroundRepeat = 'no-repeat';
domElement.style.backgroundPosition = 'left center';
domElement.style.paddingLeft = '30px';
}
चेक बाहर this fiddle एक काम उदाहरण के लिए:
listeners: {
change: function() {
var pickerDOM = document.querySelector('#' + this.getId() + ' input[name="picker"]');
PickerIcons.app.prependIconToSelectfield(arguments[1], pickerDOM);
},
painted: function() {
// Initialize an icon on creation
var pickerDOM = document.querySelector('#' + this.getId() + ' input[name="picker"]');
PickerIcons.app.prependIconToSelectfield(this.getValue(), pickerDOM);
}
}
इसी समारोह prependIconToSelectfield()
सिर्फ कुछ सीएसएस परिभाषित करता है।
यह अभी भी मेरे लिए कोई अच्छा समाधान नहीं है, क्योंकि इस तरह के हैकिश करने के बाद डोम मैनिपुलेशन मेरे स्वाद के लिए नकली है। मुझे नहीं पता कि डोम में सक्रिय रूप से गड़बड़ करने के दुष्प्रभाव क्या बड़ी परियोजनाओं में हो सकते हैं, और इसे कठिन तरीके से नहीं सीखना चाहते हैं। तो, मैं अभी भी एक क्लीनर समाधान की तलाश में हूं।
आपके उत्तर के लिए धन्यवाद। कृपया मत सोचो कि मैं इस गिरावट को विस्मरण में डाल दूंगा, लेकिन अगले कुछ हफ्तों में मैं हजारों परीक्षणों की तरह जा रहा हूं। मैं आपके विचार को प्राप्त करूंगा और अपने निष्कर्षों को रिपोर्ट करूँगा। – MCL
ठीक है। मैंने थोड़ा सा खेला, लेकिन बहुत दूर नहीं आया। मेरा दृष्टिकोण सीएसएस 'स्थिति' से निपटना था, जो 'बाएं' और 'टॉप' के साथ संयुक्त था। इस तरह, मैं जहां चाहूं 'x-clear-icon' को स्थानांतरित कर सकता हूं, लेकिन चयनक्षेत्र का टेक्स्ट (उदा। ** हीरे **) अब बस कवर हो जाता है और जैसा कि मैंने आशा की थी उसे अलग नहीं किया। तो, ऐसा लगता है कि मुझे 'इनपुट [name = "picker"] वैसे भी' हेरफेर करना होगा '। आपने 'x-clear-icon' को कैसे हटाया? संपादित करें: यहां एक पहेली है ('चित्रित' हैंडलर को देखें): [क्लिक करें] (http://jsfiddle.net/jTX22/1/) – MCL
आप डायमंड टेक्स्ट के लिए पैडिंग सेट कर सकते हैं या शायद एक टेक्स्ट इंडेंट जो दे देंगे आप वांछित परिणाम –