在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参数中。
答案 0 :(得分:1)
我发现了一种解决方法,即使我仍然不明白为什么这是必要的:
在成功侦听器中,在加载json响应后,我将自定义值添加到存储中,然后将组合框设置为此新添加的值:
success: function() {
diagnosisStore.add({label: rec.data.diagnosis, value: rec.data.diagnosis});
formPanel.getForm().findField('diagnosis').setValue(rec.data.diagnosis);
},
当我想使用setValue时,不知道为什么我需要将自定义值添加到商店,而用户可以通过键盘手动输入任何内容。