我想出了另一个看起来更简单的解决方案,并且快速测试显示没有副作用:
我们可以保持 Combobox 逻辑不变,但只需通过 CSS 隐藏所选项目:
.x-boundlist-selected {
display: none;
}
瞧,我们看不到所选项目!不知道这在生产代码中有多可靠,但我认为仍然值得考虑......
更新。如果您想通过 Combobox 的配置标志控制此行为,这里是完整的解决方案:
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;
}
更新 2. 发现我的方法存在 UI 问题!
从下拉列表中隐藏选定的项目会给键盘导航带来一个怪癖:虽然该元素在视觉上是隐藏的,但它仍然存在,并且当您按下 UP/DOWN 键时,Ext 会选择它。从视觉上看,这意味着您的选择将在某个时候消失,您必须再按一次 UP/DOWN 才能将其恢复到下一个可见元素上。
到目前为止,我无法找到一个简单的解决方法。我最好的选择是修改itemSelector
绑定列表(这是一个数据视图),将其设置为类似.x-boundlist-item:not(.x-boundlist-selected)
这样的内容,以便所选元素不会进入查询。
虽然选择器本身可以工作,但它并不能解决问题,因为视图会在任何其他类(包括所选项目类)应用于项目之前执行此选择器查询(这发生在Ext.view.AbstractView.refresh()中。
此外,当下拉列表出现在组合框上方时,此解决方案会导致错位!
我有一种感觉,我的方法太容易完美地工作了:)