我有一个ExtJS表单,其中包含多个具有相同名称的项目。我希望当从服务器端加载表单的值时,所有这些同名组件将被分配相同的相关值。
显然,发生的情况是只有同名组中的第一个元素获得了值,其他元素被跳过了。
有没有简单的方法可以改变这种观察到的行为?
更新
以下是表单的代码:
var productionRunAdvancedParametersForm = new Ext.form.FormPanel({
region : 'center',
name : 'productionRunAdvancedParametersCommand',
border : false,
autoScroll : true,
buttonAlign : 'left',
defaults : {
msgTarget : 'side'
},
layoutConfig : {
trackLabels : true
},
labelWidth : 200,
items : [
{
xtype : 'fieldset',
title : 'ASE',
collapsible : true,
autoHeight : true,
items : [ {
xtype : 'hidden',
name : 'genScens'
}, {
xtype : 'checkbox',
name : 'genScens',
fieldLabel : 'GEN_SCENS',
disabled : true
}]
}]
,
listeners : {
beforerender : function(formPanel) {
formPanel.getForm().load({
url : BASE_URL + 'get-data-from-server.json',
method : 'GET',
success : function(form, action) {
var responseData = Ext.util.JSON.decode(action.response.responseText);
if (!responseData.success) {
Screen.errorMessage('Error', responseData.errorMessage);
}
},
failure : function(form, action) {
Ext.Msg.alert("Error", Ext.util.JSON.decode(action.response.responseText).errorMessage);
}
});
}
}
});
服务器响应为:
{"data":{"genScens":true},"success":true}
发生的只有隐藏的组件的值是'true',禁用的复选框没有被选中。如果我将它们交换到items数组中,则会选中该复选框,但隐藏的没有任何价值。
最佳答案
您看到的行为正是我所期望的。
在表单内部,多次使用相同的字段名-除非您将其用于单选按钮(不是这种情况)-都是错误。只需考虑一下表单提交功能在这种情况下应该做什么:它是否应该两次发送相同的键(输入名称),并且可能使用不同的值?
(显然,对于单选按钮,答案很简单:将输入名称作为键,将选中的单选按钮的值作为值发送)。
Ext的作用是,扫描表单搜索以查找与名称匹配的输入字段,然后将值分配给第一个匹配的输入(因为它假定没有重复的名称)。
您可以通过以下方法解决此问题:
使用两个不同名称的形式(例如genScens
和genScens_chk
)
在服务器端响应中的两个不同键下发送相同的值,例如{"data":{"genScens":true,"genScens_chk":true},"success":true}
请注意:如果您无法更改服务器响应,仍然使用两个不同的名称,只需向success
函数添加一个回调,并相应地设置genScens_chk
值,如下所示:
success : function(form, action) {
var responseData = Ext.util.JSON.decode(action.response.responseText);
if (!responseData.success) {
Screen.errorMessage('Error', responseData.errorMessage);
}
else{
formPanel.getForm().findField("genScens_chk").
setValue(responseData.data.genScens);
}
},