Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/extjs/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ajax 加载后ComboBox.setValue设置了错误的值_Ajax_Extjs_Combobox_Onload_Setvalue - Fatal编程技术网

Ajax 加载后ComboBox.setValue设置了错误的值

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

我有一个组合框,它表示从服务器端检索到的登录类型。登录类型的转换应该在客户端完成

这是从服务器端返回的json示例:

[
  {"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版本进行测试。