Ajax 加载后ComboBox.setValue设置了错误的值
我有一个组合框,它表示从服务器端检索到的登录类型。登录类型的转换应该在客户端完成 这是从服务器端返回的json示例:Ajax 加载后ComboBox.setValue设置了错误的值,ajax,extjs,combobox,onload,setvalue,Ajax,Extjs,Combobox,Onload,Setvalue,我有一个组合框,它表示从服务器端检索到的登录类型。登录类型的转换应该在客户端完成 这是从服务器端返回的json示例: [ {"valueField":"activeDirectory"}, {"valueField":"userpass"} ] Combobox的定义如下: Ext.create('Ext.form.ComboBox', { fieldLabel : window._i18n['login.login-panel.logintype'], itemId
[
{"valueField":"activeDirectory"},
{"valueField":"userpass"}
]
Combobox的定义如下:
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'
})
var loginTypesStore = Ext.create('Ext.data.Store', {
fields: ['valueField', 'localizedDisplayField'],
data: [
{"valueField": "userpass", "localizedDisplayField": "Localized userpass"},
{"valueField": "activeDirectory", "localizedDisplayField": "Localized activeDirectory"}
]
});
模型和存储定义为:
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'
});
我为store添加了load listener,它应该将combobox值设置为收到的第一个项目:
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”
是“Active Directory”
键的英文翻译
这怎么可能
当我将存储替换为本地存储时,如下所示:
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'
})
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
问题在于读取翻译文件。Translation
Active directory EN
的末尾确实有不可见的\r
字符,问题出在函数getValue
中。从下图中,您可以看到变量d
等于Active Directory EN
,但它附加了\r
,而b.getDisplayValue()
没有它(我调试了这个值,并从DOM中检索了这个值,所以可能\r
在那里丢失了)
问题在于读取翻译文件。Translation
Active directory EN
的末尾确实有不可见的\r
字符,问题出在函数getValue
中。从下图中,您可以看到变量d
等于Active Directory EN
,但它附加了\r
,而b.getDisplayValue()
没有它(我调试了这个值,并从DOM中检索了这个值,所以可能\r
在那里丢失了)
您能否发布
combo.getStore().getAt(0).get(combo.valueField)
,combo.getStore().getAt(0).get(“valueField”)
?此外,我建议始终使用getter方法而不是data属性来访问记录和字段。我真正想要的是提交那个值字段(不是显示字段)。这就是为什么我添加了hiddenName字段,但它仍然没有提交。您使用的是哪个版本的ExtJS?这听起来像个虫子。对不同的ExtJS版本进行修改和测试。您能发布combo.getStore().getAt(0).get(combo.valueField)
,combo.getStore().getAt(0).get(“valueField”)
?此外,我建议始终使用getter方法而不是data属性来访问记录和字段。我真正想要的是提交那个值字段(不是显示字段)。这就是为什么我添加了hiddenName字段,但它仍然没有提交。您使用的是哪个版本的ExtJS?这听起来像个虫子。对不同的ExtJS版本进行测试。