динамически добавлять элементы на панель и столбцы в сетку

Я использую ExtJs 4.1 и пытаюсь динамически добавлять элементы на панель и столбцы в сетку.

Мое требование

MainPanel (Ext.panel.Panel) имеет 2 дочерних элемента:

  • Динамическая панель (Ext.panel.Panel)

    1. I want to add this panel to the main panel dynamically.
    2. Затем... Я хочу динамически добавлять элементы в DynamicPanel, элементы представляют собой конфигурацию MainPanel, называемую: "элементы"
  • Динамическая сетка (Ext.grid.Panel)

    1. I want to again, add this to the main panel dynamically.
    2. Я хочу динамически добавлять столбцы в DynamicGrid, и снова эти столбцы являются частью столбцов сетки конфигурации MainPanel.

Я получаю следующую ошибку:

this.dpanel is undefined
[Break On This Error] this.dpanel.add(this.elements)

Мой код выглядит следующим образом:

Ext.create('Ext.data.Store', {
    storeId: 'simpsonsStore',
    fields: ['name', 'email', 'phone', 'date', 'time'],
    data: {
        'items': [{
            "name": "Lisa",
                "email": "[EMAIL="
            [email protected] "][email protected][/EMAIL]",
                "phone": "555-111-1224",
                "date": "12/21/2012",
                "time": "12:22:33"
        }, {
            "name": "Bart",
                "email": "[EMAIL="
            [email protected] "][email protected][/EMAIL]",
                "phone": "555-222-1234",
                "date": "12/21/2012",
                "time": "12:22:33"
        }, {
            "name": "Homer",
                "email": "[EMAIL="
            [email protected] "][email protected][/EMAIL]",
                "phone": "555-222-1244",
                "date": "12/21/2012",
                "time": "12:22:33"
        }, {
            "name": "Marge",
                "email": "[EMAIL="
            [email protected] "][email protected][/EMAIL]",
                "phone": "555-222-1254",
                "date": "12/21/2012",
                "time": "12:22:33"
        }]
    },
    proxy: {
        type: 'memory',
        reader: {
            type: 'json',
            root: 'items'
        }
    }
});
Ext.define('DynamicGridPanel', {
    extends: 'Ext.grid.Panel',
    alias: 'widget.dynamicGridPanel',
    title: 'Simpsons',
    store: Ext.data.StoreManager.lookup('simpsonsStore'),
    selType: 'rowmodel',
    plugins: [
    Ext.create('Ext.grid.plugin.CellEditing', {
        clicksToEdit: 1
    })],
    height: 200,
    width: 200
});

Ext.define('DynamicPanel', {
    extend: 'Ext.panel.Panel',
    alias: 'widget.dynamicPanel',
    title: 'DynamicAdd',
    width: 200,
    height: 200
});
Ext.define('MainPanel', {
    extend: 'Ext.panel.Panel',
    alias: 'widget.dynamicMainPanel',
    title: 'MainPanel',
    renderTo: Ext.getBody(),
    width: 600,
    height: 600,
    constructor: function (config) {
        var me = this;
        me.callParent(arguments);
        me.dpanel = Ext.create('DynamicPanel');
        me.dgridpanel = Ext.create('DynamicGridPanel');
        me.items = [this.dpanel, this.dgridpanel];
    }, //eo constructor
    onRender: function () {
        var me = this;
        me.callParent(arguments);
        //I am getting  error at the below lines saying the dpanel and dynamicGridPanel  undefined
        me.dpanel.add(this.elements);
        me.dynamicGridPanel.columns.add(this.gridcolumns);
    }
});
var panel1 = Ext.create('MainPanel', {
    gridcolumns: [{
        xtype: 'actioncolumn',
        width: 42,
        dataIndex: 'notes',
        processEvent: function () {
            return false;
        }
    }, {
        xtype: 'gridcolumn',
        header: 'Name',
        dataIndex: 'name',
        editor: 'textfield'
    }, {
        xtype: 'gridcolumn',
        header: 'Email',
        dataIndex: 'email',
        flex: 1,
        editor: {
            xtype: 'textfield',
            allowBlank: false
        }
    }, {
        header: 'Phone',
        dataIndex: 'phone'
    }, {
        xtype: 'gridcolumn',
        header: 'Date',
        dataIndex: 'date',
        flex: 1,
        editor: {
            xtype: 'datetextfield',
            allowBlank: false
        }
    }, {
        xtype: 'gridcolumn',
        header: 'Time',
        dataIndex: 'time',
        flex: 1,
        editor: {
            xtype: 'timetextfield',
            allowBlank: false
        }
    }],
    elements: [{
        xtype: 'numberfield',
        width: 70,
        tabIndex: 1,
        fieldLabel: 'Account No',
        itemId: 'acctno',
        labelAlign: 'top'
    }, {
        xtype: 'textfield',
        itemId: 'lastname',
        width: 90,
        tabIndex: 2,
        fieldLabel: 'Last Name',
        labelAlign: 'top'
    }, {
        xtype: 'textfield',
        itemId: 'firstname',
        width: 100,
        tabIndex: 3,
        fieldLabel: 'First Name',
        labelAlign: 'top'
    }]
});

person nilesh    schedule 15.12.2012    source источник
comment
@Reimius Причина, по которой я разместил код, потому что он не работает, и я много пробовал, если он базовый, то лучше помочь мне, отправив ссылку или ответив, а не просто проголосовав против, потому что это поможет вам получить хороший рейтинг репутации и если ваш ответ правильный, я обязательно отмечу его как ответ.   -  person nilesh    schedule 20.12.2012
comment
@Reimius спасибо, приятель, за то, что неоднократно просматривал мой форум qts и с таким трудом отвечал на все сообщения, размещенные мной, даже если вы думали, что не стоит отвечать (или вы тоже искали ответ и поэтому попросили дополнительные баллы за награду) в любом случае получил ответ и очень ценю ваши усилия за то, что вы не отвечаете и не спорите о том же. Всего наилучшего ....   -  person nilesh    schedule 21.12.2012
comment
Я сделал этот комментарий только после того, как вы не отметили правильный ответ ниже, но, похоже, вы поняли, что он был прав. Я проголосовал за этот ответ, лол.   -  person Reimius    schedule 22.12.2012
comment
+1. И я надеюсь, ты усвоил урок, Реймиус.   -  person dan-klasson    schedule 23.03.2013


Ответы (1)


Создайте дочерние элементы в initComponent:

initComponent: function() {
   var me = this;
   me.dpanel = Ext.create('DynamicPanel');
   me.dgridpanel = Ext.create('DynamicGridPanel');
   me.items = [this.dpanel, this.dgridpanel]; 
   me.callParent(arguments);
} 

Не забудьте определить требуемую конфигурацию для столбцов в вашей сетке:

columns: []

Посмотрите на этот пример здесь для динамического добавления столбцов в сетку http://neiliscoding.blogspot.de/2011/09/extjs4-dynamically-add-columns.html

person Darin Kolev    schedule 17.12.2012