ExtJS:将默认设置设置为嵌套对象的面板项

ExtJS: Setting defaults to panel items for nested objects

这个问题是 的一部分,并且 post 通过 @scebotari66 在主要 post 上的建议独立地在此处提出。

正如您将在下面注意到的那样;有Ext.Array.map定义相关功能defaults

// Statment
    initComponent: function () {
    var me = this;
    me.items = Ext.Array.merge(
        me.getFormSt(),
        Ext.Array.map(me.getForm(), function (listFldConfig) { //Aim to using the array map function to set flex property for subset fields
            listFldConfig.flex = 1;
            return listFldConfig;
        }),
        me.getFormEnd()
    );
    me.callParent(arguments)
},

// Implementation
getForm: function () {
        var me = this;
        var form = [
            { // Array.map func. sets `flex` to this obj.
                xtype: 'fieldcontainer',
                layout: { type: 'vbox', align: 'stretch', pack: 'start' },
                items: [
                    {
                        xtype: 'fieldcontainer',
                        layout: 'hbox',
                        items: [
                            {
                                xtype: 'foofield',
                                //flex: 1 //But I need to set `flex` as default for this obj. in nested items array
                            },
                            {
                                xtype: 'barfield',
                                //flex: 1 //But I need to set `flex` as default for this obj. in nested items array
                            }

问题是此实现按预期工作,但在这种情况下,我正在创建一个 fieldcontainer 对象,其中包含所有其他内容和项目。 Array.map 仅将 flex 配置设置为第一个 fieldcontainer obj。我只需要为具有 foofieldbarfield 的嵌套 items 定义 flex 配置。

默认值是使用容器上的 defaults 配置定义的:

xtype: 'fieldcontainer',
layout: 'hbox',
defaults: {
    flex: 1
},
items: [
    {
        xtype: 'foofield',
    },
    {
        xtype: 'barfield',
    }

要覆盖嵌套容器,您可以将多个 defaults 配置相互嵌套:

defaults: {
    defaults: {
        flex: 1
    },
    flex: 1
}

请注意,xtype 配置作为 defaults 对象的一部分可能会导致意外结果,您应该使用 defaultType 配置来定义默认子类型容器的元素。

根据@NarendraJadhav 的意见;创建了我自己的结构...

定义;

Ext.define('MyApp.BaseFldCon', {
    extend: 'Ext.form.FieldContainer',
    xtype: 'basefldcon'
});

Ext.define('MyApp.VBoxFldCon', {
    extend: 'MyApp.BaseFldCon',
    xtype: 'vboxfldcon',
    layout: {
        type: 'vbox',
        align: 'stretch',
        pack: 'start'
    }
});

Ext.define('MyApp.HBoxFldCon', {
    extend: 'MyApp.BaseFldCon',
    xtype: 'hboxfldcon',
    layout: {
        type: 'hbox'
    },
    defaults: {
        flex: 1
    }
});

实施;

{
   xtype: 'vboxfldcon',
   items: [
            {
              xtype: 'hboxfldcon',
              items: [
                       {
                           xtype: 'foofield',
                        },
                        {
                           xtype: 'barfield'
                        },
                        {
                           xtype: 'foocombo'
                        }
                     ]
             },