我想出了另一种解决方案,看起来更加简单和快速的测试显示无副作用:
我们可以把组合框的逻辑不变,而只是通过CSS隐藏选定项目:
.x-boundlist-selected {
display: none;
}
而且瞧,我们没有看到选定的项目!不知道怎么可靠,这将是在生产代码,但还是值得考虑的,我想......
更新。下面是完整的解决方案,如果你想控制通过组合框的配置将此行为:
Ext.define('My.ComboBox', {
extend: 'Ext.form.field.ComboBox',
/**
* @cfg {Boolean} hideActive=true
* When true, hides the currently selected value from the dropdown list
*/
hideActive: true,
/**
* Internal method that creates the BoundList
*/
createPicker: function() {
var picker = this.callParent(arguments);
// honor the hideActive flag
if(this.hideActive) {
picker.addCls('x-boundlist-hideactive');
}
return picker;
}
});
某处在你的CSS:
.x-boundlist-hideactive .x-boundlist-selected {
display: none;
}
UPDATE 2.发现一个UI问题我的方法!
从下拉列表中隐藏选定的项目引入了键盘导航的怪癖:尽管该元素在视觉上隐藏,但它仍然存在,并且按下UP/DOWN键时Ext将选择它。在视觉上,这意味着你的选择会在某个时候消失,你将不得不再次按下UP/DOWN来重新显示下一个可见元素。
到目前为止,我无法找到一个简单的解决方案。 我最好的办法是修改绑定列表(这是一个数据视图)的itemSelector
,将其设置为.x-boundlist-item:not(.x-boundlist-selected)
之类的东西,以便所选元素不会将其添加到查询中。
而选择自己的工作,因为视图执行之前的任何其他类此选择查询(包括所选项目类),它并没有解决这个问题得到应用到项目(这发生在Ext.view.AbstractView.refresh()。
此外,该解决方案将导致下拉列表错位,当它出现在组合框上面!
我有一种感觉,我的做法是太容易工作得很好:)
在Sencha的论坛上提出同样的问题:http://www.sencha.com/forum/showthread.php?241063-Combobox-hide-selected-value-from-dropdown-list&p=882210 –