Расширение контроллера в приложении ExtJS 4 MVC

Я создаю свое приложение ExtJS 4, следуя структуре MVC. Я хочу сделать расширяемую сетку MyGrid с некоторыми функциями, которые я могу использовать несколько раз. Поэтому, я думаю, у него должен быть свой собственный контроллер, который также расширяется, чтобы функциональность наследовалась. Как это правильно сделать?

В приведенном ниже коде показано, как я расширяю контроллер MyGrid с помощью MyExtendedGrid. Я понимаю, что переопределяю функцию init в контроллере MyGrid, чтобы она никогда не вызывалась. Проблема решается простым вызовом «супер» init в MyGrid из MyExtendedGrid init или слиянием объектов control? Это правильный способ сделать это в духе MVC? Если да, то как?

controller/MyGrid.js :

Ext.define('App.controller.MyGrid', {
    extend: 'Ext.app.Controller',
    refs: [
        {
            ref: 'myGridView',
            selector: 'mygrid'
        }
    ],
    init: function() {
        var me=this;
        me.control({
            'mygrid textfield[name=searchField]': {
                change: function() {
                    var view = me.getMyGridView();
                    // Do something with view
                }
            }
        });
    }
});

controller/MyExtendedGrid.js:

Ext.define('App.controller.MyExtendedGrid', {
    extend: 'App.controller.MyGrid',
    views: [
        'grids.MyExtendedGrid'],
    refs: [
        {
            ref: 'myExtendedGridView',
            selector: 'myextendedgrid'
        }
    ],
    init: function() {
        var me=this;
        me.control({
            'myextendedgrid': {
                // Some control code
                // Using getMyExtendedGridView()
            }
        });
    }
});

просмотр/сетки/MyGrid.js:

Ext.define('App.view.grids.MyGrid', {
    extend: 'Ext.grid.Panel',
    alias : 'widget.mygrid',
    requires: [
    ],
    store: '', // Not defined here
    columns: [ ], // Not defined here

    initComponent: function() {
        var me = this;
        me.tbar = [
            'Search',
            {
                 xtype: 'textfield',
                 name: 'searchField',
                 hideLabel: true,
                 width: 150
            }
        ];
        me.callParent(arguments);
    }
});

просмотр/сетки/MyExtendedGrid.js:

Ext.define('App.view.grids.MyExtendedGrid', {
    extend: 'App.view.grids.MyGrid',
    alias : 'widget.myextendedgrid',
    store: 'MyStore',
    columns: [
        // ...
    ],

    initComponent: function() {
        var me = this;
        me.bbar = [
            //...
        ];
        me.callParent(arguments);
    }
});
9
задан Afshin Mehrabani 19 December 2012 в 06:54
поделиться