ExtJS 3:表单加载具有相同名称的多个项目

时间:2013-11-27 13:36:42

标签: javascript forms extjs

我有一个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数组中交换它们,则选中复选框但隐藏不会获得任何值。

1 个答案:

答案 0 :(得分:2)

你看到的行为正是我所期待的。

在表单中,多次使用相同的字段名称 - 无论您将其用于单选按钮,情况并非如此 - 错误。想想在这种情况下表单提交功能应该做什么:它应该发送两次相同的密钥(输入名称),可能有不同的值吗?

(显然,对于radiobuttons,答案很简单:将输入名称作为键发送,选中单选按钮的值作为值)。

这里的Ext是什么,扫描表单搜索与名称匹配的输入字段,然后将值分配给第一个匹配的输入(因为它假定没有重复的名称)。

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

  1. 在表单中使用两个不同的名称(例如genScensgenScens_chk
  2. 在服务器端响应中的两个不同密钥下发送相同的值,例如

    {"data":{"genScens":true,"genScens_chk":true},"success":true}

  3. 请注意:如果您无法更改服务器响应,仍然使用两个不同的名称,只需向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);
     }
    },