ExtJs组合框:加载后不填充自定义值(forceSelection为false)

时间:2011-08-26 02:59:55

标签: extjs combobox extjs4

在ExtJs4中,我有一个带有组合框的表单,其中数据通过json从数据库加载

this.getForm().load({url: '/ext/get-patient', ...

允许用户输入除预定义值之外的自定义值,通过forceSelection属性设置为false来配置。

我遇到的问题是:

当用户从组合框中的商店中选择任何预定义值时,再次保存并重新加载条目,一切正常。 但是当用户在组合框字段中输入自定义值(即“abcde”)时,保存(我可以看到输入的自定义值正确存储在数据库中),然后再次加载表单数据(正确的自定义值)在json响应中),在加载过程之后,组合框将不会填充此自定义值。

为什么 - 或者如何解决它?

这是组合框使用的商店定义:

// The data store for the diagnoses combobox
var diagnosisStore = Ext.create('Ext.data.Store', {
    fields: ['label', 'value'],
    data: (function() {
        var data = [
            {label: '结膜炎', value: '结膜炎'},
            {label: '角膜炎', value: '角膜炎'},
            {label: '青光眼', value: '青光眼'},
            {label: '白内障', value: '白内障'},
            {label: '葡萄膜炎', value: '葡萄膜炎'},
            {label: '屈光不正', value: '屈光不正'},
            {label: '眼部异物', value: '眼部异物'},
            {label: '翼状胬肉', value: '翼状胬肉'},
            {label: '泪囊炎', value: '泪囊炎'},
            {label: '倒睫', value: '倒睫'},
            {label: '角膜溃疡', value: '角膜溃疡'},
            {label: '角膜白斑', value: '角膜白斑'},
            {label: '眼内炎', value: '眼内炎'}
            ];
        return data;
    })()
});

...和组合框,请注意forceSelection设置为false。

{
    xtype: 'combobox',
    name: 'diagnosis',
    fieldLabel: lang["patient.diagnosis"],
    labelWidth: 60,
    flex:1,
    store: diagnosisStore,
    valueField: 'value',
    displayField: 'label',
    typeAhead: true,
    queryMode: 'local',
    forceSelection: false
}

我还尝试在成功检索到json响应后在侦听器中运行这行代码:

formPanel.getForm().findField('diagnosis').setValue(rec.data.diagnosis);

但除非我设置的值是商店的一部分,否则它不会填充。那么,为什么用户可以在组合框中输入任何内容,但我不能在代码中使用setValue做同样的事情?对我没有意义。

修改/更新

有趣的是:即使自定义值没有填充/没有显示给用户,似乎组合框仍然保存自定义值。因为我打电话给这一行:

alert( formPanel.getForm().findField('diagnosis').getValue() );

它实际上会在警告对话框中显示我刚尝试通过setValue()设置的值。 似乎这个组合框组件有点儿麻烦。

我在ExtJs中使用此组合框找到的另一个问题:还注意到组合框中的空白值不会在表单中提交(请求中的json参数),只有当我输入一个空格(“” ),然后该字段实际上包含在提交的json参数中。

1 个答案:

答案 0 :(得分:1)

我发现了一种解决方法,即使我仍然不明白为什么这是必要的:

在成功侦听器中,在加载json响应后,我将自定义值添加到存储中,然后将组合框设置为此新添加的值:

success: function() {
    diagnosisStore.add({label: rec.data.diagnosis, value: rec.data.diagnosis});
    formPanel.getForm().findField('diagnosis').setValue(rec.data.diagnosis);
},

当我想使用setValue时,不知道为什么我需要将自定义值添加到商店,而用户可以通过键盘手动输入任何内容。