ComboBox.setValue 加载后设置了错误的值
ComboBox.setValue after on load sets wrong value
我有一个组合框,它代表从服务器端检索到的登录类型。登录类型的翻译应该在客户端完成。
这是从服务器端返回的 json 示例:
[
{"valueField":"activeDirectory"},
{"valueField":"userpass"}
]
组合框定义如下:
Ext.create('Ext.form.ComboBox', {
fieldLabel : window._i18n['login.login-panel.logintype'],
itemId : 'logintype',
store : loginTypesStore,
name : 'loginType',
hiddenName: 'hiddenName',
displayField : 'localizedDisplayField',
valueField : 'valueField',
submitValue: true,
forceSelection: true,
editable : false,
allowBlank : false,
queryMode: 'remote'
})
模型和商店定义为:
Ext.define('loginTypeModel', {
extend: 'Ext.data.Model',
fields: [
{name: 'valueField' },
{
name: 'localizedDisplayField',
convert: function(value, record) {
return window._i18n['login.login-panel.logintypename.' + record.get('valueField')];
}
}
],
proxy: {
type: 'ajax',
url: 'Admin/LoginTypes',
reader: {
type: 'json'
}
}
});
var loginTypesStore = Ext.create('Ext.data.Store', {
autoLoad: false,
type: 'json',
model: 'loginTypeModel'
});
我为商店添加了负载侦听器,它应该将组合框值设置为收到的第一个项目:
loginTypesStore.on('load', function () {
var combo = Ext.getCmp('login-panel').getComponent('logintype');
console.log('combo.Value : [' + combo.getValue() + '] -> [' + loginTypesStore.data.first().data.valueField + ']');
combo.setValue(loginTypesStore.data.first().data.valueField); //loginTypesStore.data.first().data.valueField);
console.log('combo.Value = ' + combo.getValue());
});
但是,在控制台输出中我可以看到:
combo.Value : [null] -> [activeDirectory]
combo.Value = Active Directory EN
"Active Directory EN"
是 "activeDirectory"
键的英文翻译。
这怎么可能?
当我用这样的本地商店替换商店时:
var loginTypesStore = Ext.create('Ext.data.Store', {
fields: ['valueField', 'localizedDisplayField'],
data: [
{"valueField": "userpass", "localizedDisplayField": "Localized userpass"},
{"valueField": "activeDirectory", "localizedDisplayField": "Localized activeDirectory"}
]
});
一切正常,即在控制台中我看到:
combo.Value : [null] -> [userpass]
combo.Value = userpass
问题出在读取翻译文件时。翻译 Active directory EN
确实在末尾有不可见的 \r
字符,问题出在函数 getValue
中。从下图中,您可以看到变量 d
等于 Active Directory EN
但它附加了 \r
,而 b.getDisplayValue()
没有它(我调试了这个值是从DOM 所以也许 \r
在那里丢失了)。
我有一个组合框,它代表从服务器端检索到的登录类型。登录类型的翻译应该在客户端完成。
这是从服务器端返回的 json 示例:
[
{"valueField":"activeDirectory"},
{"valueField":"userpass"}
]
组合框定义如下:
Ext.create('Ext.form.ComboBox', {
fieldLabel : window._i18n['login.login-panel.logintype'],
itemId : 'logintype',
store : loginTypesStore,
name : 'loginType',
hiddenName: 'hiddenName',
displayField : 'localizedDisplayField',
valueField : 'valueField',
submitValue: true,
forceSelection: true,
editable : false,
allowBlank : false,
queryMode: 'remote'
})
模型和商店定义为:
Ext.define('loginTypeModel', {
extend: 'Ext.data.Model',
fields: [
{name: 'valueField' },
{
name: 'localizedDisplayField',
convert: function(value, record) {
return window._i18n['login.login-panel.logintypename.' + record.get('valueField')];
}
}
],
proxy: {
type: 'ajax',
url: 'Admin/LoginTypes',
reader: {
type: 'json'
}
}
});
var loginTypesStore = Ext.create('Ext.data.Store', {
autoLoad: false,
type: 'json',
model: 'loginTypeModel'
});
我为商店添加了负载侦听器,它应该将组合框值设置为收到的第一个项目:
loginTypesStore.on('load', function () {
var combo = Ext.getCmp('login-panel').getComponent('logintype');
console.log('combo.Value : [' + combo.getValue() + '] -> [' + loginTypesStore.data.first().data.valueField + ']');
combo.setValue(loginTypesStore.data.first().data.valueField); //loginTypesStore.data.first().data.valueField);
console.log('combo.Value = ' + combo.getValue());
});
但是,在控制台输出中我可以看到:
combo.Value : [null] -> [activeDirectory]
combo.Value = Active Directory EN
"Active Directory EN"
是 "activeDirectory"
键的英文翻译。
这怎么可能?
当我用这样的本地商店替换商店时:
var loginTypesStore = Ext.create('Ext.data.Store', {
fields: ['valueField', 'localizedDisplayField'],
data: [
{"valueField": "userpass", "localizedDisplayField": "Localized userpass"},
{"valueField": "activeDirectory", "localizedDisplayField": "Localized activeDirectory"}
]
});
一切正常,即在控制台中我看到:
combo.Value : [null] -> [userpass]
combo.Value = userpass
问题出在读取翻译文件时。翻译 Active directory EN
确实在末尾有不可见的 \r
字符,问题出在函数 getValue
中。从下图中,您可以看到变量 d
等于 Active Directory EN
但它附加了 \r
,而 b.getDisplayValue()
没有它(我调试了这个值是从DOM 所以也许 \r
在那里丢失了)。