私は非常に単純な問題を抱えていますが、その解決策はそれほど単純ではないことがわかりました。の各オプションの前に画像
を追加したい。より正確に言うと、トリガーと選択フィールドの現在の値に画像を追加したいと思います。
簡単にするために、簡単な例を作成します。 selectfield
picker
たとえば、ダイヤ、ハート、スペード、クラブの4つのトランプスーツから1つをユーザーに選択させたいとします。視覚的な認識をサポートするには、対応する記号を各スーツ名の前に追加して、次のようになります。
与えられたオプションのセットから自然に選択できるようにするsenchatouchコンポーネントの私の最初の選択はでしたselectfield
。残念ながら、純粋なテキストしか表示できないようで、それ以上は表示できません。sencha touch sourceを掘り下げた後、私はついに半分の解決策を思いつきました。基本的に、私はカスタムを渡します。この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);
}
}
}
このソリューションの実用的なフィドルは、ここにあります。
私の解決策はそれほど悪くはありませんが、わずかな外観上の問題があり、それは私には受け入れられません:アイコンはpicker
(上のスクリーンショットの下部)にのみ表示され、それ自体(上部、灰色の部分)には表示されませんselectfield
オプションが選択されました。また、selectfieldの現在の値にもアイコンを追加する良い方法はないようです。
そして、それが私の質問の主な関心事です。ピッカーのオプションとセレクフィールドの現在の値の両方にアイコンを追加するには、どのような良い方法がありますか?既存のソリューションに比較的少ないコードを追加するだけでよいのでしょうか、それともまったく別のアプローチを取る必要があるのでしょうか。
すべての貢献に感謝します。ありがとうございました!
更新:
いくつかのハッキングのselectfield
後、私はそれ自体にアイコンを追加する方法(醜いもの)を見つけました。これは主に残忍なHTMLDOM操作に基づいています。selectfield
自分自身(change
およびpainted
)のイベントハンドラーも定義するようになりました。初期化時および値が変更されるたびに、ハンドラーは生成されたDOMで基になるものを検索し、<input>
それをいじります。value
(フレームワークが属性を変更するため、そもそもHTMLを割り当てることができないのは、おそらくその悪い子です。value
一方、プレーンテキストしか含めることができません。)これが、私が's
を定義する方法です。selectfield
listeners
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()
は、CSSを定義するだけです。
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';
}
実用的な例については、このフィドルをチェックしてください。
この種のハック的なDOM操作を行うことは、私の好みにはあまりにも不正であるため、これはまだ私にとって良い解決策ではありません。DOMを積極的にいじり回した場合の副作用が、より大きなプロジェクトでどのようなものになるかはわかりません。難しい方法でそれを学びたくありません。だから、私はまだよりクリーンな解決策を探しています。