我有一个非常简单的问题,其解决方案根本不是那么简单。
我想在a的每个选项前面添加图像selectfield
。更准确地说,我想将图像添加到picker
它的触发器,以及选择字段的当前值。
为了简单起见,我将创建一个小示例:
假设您希望用户在Diamonds、Hearts、Spades 和 Clubs四种扑克牌花色中选择一种。为了支持视觉识别,您希望在每个西装名称前面加上相应的符号,所以它可能看起来像这样:
我第一个选择 sencha touch 组件,它可以从一组给定的选项中进行选择,自然是selectfield
. 不幸的是,它似乎只能显示纯文本,仅此而已。在深入挖掘了 sencha touch 资源后,我终于想出了半个解决方案。基本上,我传递了selectfield
一个 custom defaultPhonePickerConfig
,其中对应的picker
(用于selectfield
显示选项的)被分配了一个 custom 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
自身前面加上一个图标。它主要基于残酷的 HTML DOM 操作:我现在还为selectfield
自身定义事件处理程序(change
和painted
)。在初始化和每次更改值时,我的处理程序都会在生成的 DOM 中搜索底层<input>
并对其进行处理。(那个坏男孩可能是我们一开始不能分配 HTML 的原因,因为框架改变了它的value
属性。value
另一方面,它只能包含纯文本。)
这就是我定义selectfield
's 的方式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 的副作用是什么,并且不想以艰难的方式学习它。所以,我仍在寻找更清洁的解决方案。