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

时间:2018-07-04 10:16:17

标签: javascript arrays object extjs defaults

该问题是How to set defaults for Grid columns within initComponent的一部分,并通过主帖子上的@ scebotari66建议独立发布在这里。

您将在下面注意到; 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。我只需要为具有flexitems的嵌套foofield定义barfield配置。

2 个答案:

答案 0 :(得分:1)

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

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

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

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

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

答案 1 :(得分:0)

通过@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'
                        }
                     ]
             },