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 在那里丢失了)。