Extjs combobox 多个选项的displayField相同时返回值不正确

在使用ExtJS Combobox时遇到一个问题,当Combobox的选项中有多个相同的displayField,失去焦点后调用getValue()总是返回第一个valueField。问题根源在于beforeBlur事件中调用的assertValue方法。为解决此问题,可以通过覆盖该方法来修正。此问题在3.4版本之后已被官方修复。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

最近碰到个combobox的问题,当combobox里面有多个相同的displayField,无论你选哪一个,只要组件失去焦点后,调用getValue()时总是返回第一个valueField,

通过debug源码,发现combobox的beforeBlur事件中调用了assertValue的方法,而问题就是出在这里,原因写在注释中:

assertValue : function(){
var val = this.getRawValue(),
rec = this.findRecord(this.displayField, val);

if(!rec && this.forceSelection){
if(val.length > 0 && val != this.emptyText){
this.el.dom.value = Ext.value(this.lastSelectionText, '');
this.applyEmptyText();
}else{
this.clearValue();
}
}else{
if(rec){

/*
因为前面this.findRecord(this.displayField, val)找到的是第一条符合条件的record(即第一条record),如果我们选择的选项不是第一条的话,下面的this.value == rec.get(this.valueField)就无法成立,代码将会用第一条record的value覆盖掉我们原来选择的value,所以导致只要失去焦点后再去getValue,就一直返回第一条记录的value的问题*/
if (val == rec.get(this.displayField) &&
this.value == rec.get(this.valueField)){
return;
}
val = rec.get(this.valueField || this.displayField);
}
this.setValue(val);
}
}


解决方法也很简答,覆盖掉此方法即可
代码如下:

Ext.override(Ext.form.ComboBox, {
assertValue: function () {
var val = this.getRawValue(),
rec = this.findRecord(this.displayField, val);

if (!rec && this.forceSelection) {
if (val.length > 0 && val != this.emptyText) {
this.el.dom.value = Ext.value(this.lastSelectionText, '');
this.applyEmptyText();
} else {
this.clearValue();
}
} else {
if (rec) {
//移除this.value == rec.get(this.valueField)
if (val == rec.get(this.displayField)) {
return;
}
val = rec.get(this.valueField || this.displayField);
}
this.setValue(val);
}
}
});


后来查看官方文档,发现此问题在3.4以后就修复了,唉,用太老的版本开发就是会有一些很莫名其妙的问题。。。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值