我有一个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的作用是,扫描表单搜索以查找与名称匹配的输入字段,然后将值分配给第一个匹配的输入(因为它假定没有重复的名称)。

您可以通过以下方法解决此问题:


使用两个不同名称的形式(例如genScensgenScens_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);
 }
},

10-04 22:48
查看更多