ExtJS5 Как разрешить раскладке вызывать функцию viewController?

Мне интересно, как вызвать функцию контроллера из раскладки клавиатуры в extjs 5?

Следующий код в представлении работает для привязки ключей к анонимной функции, но не к функции контроллера. Функция тоже вызывается кнопкой, и работает. Как правильно установить область действия, чтобы она вызывала функцию контроллера?

Ext.define("MyApp.view.users.List",{
    extend: 'Ext.grid.Panel',
    alias: 'widget.usersList',
    controller: 'users-list',
    listeners: {
        scope: 'controller',
        afterrender: function(window, options) {
            this.keyNav = new Ext.util.KeyMap ({
                target:window.el,
                binding: [
                    {key:"s", ctrl:true, fn: function(){alert("hallo shortkey");}},
                    {key:"c", ctrl:true, fn: "newUserFn"},
                ],
                scope:'controller'
            });
        }
    },
    tbar: [
        {
            itemId: 'users-list-btn-new',
            iconCls: 'icon-add',
            text: 'New User',
            handler: 'newUserFn'
        }
    ]
});

person Manuel    schedule 08.08.2014    source источник


Ответы (1)


У меня были аналогичные проблемы с областью действия при нажатии клавиш. Я не использую KeyMap, как вы, но логика событий по-прежнему актуальна.

Далее предполагается контроллер с методом saveNewComponent, который вы хотите вызвать. Вы должны запустить событие представления «callSave», которое прослушивается в представлении, чтобы правильно перенаправить его на контроллер.

Ext.define('teams.view.component.FormPanel', {
    extend: 'Ext.form.Panel',
    controller: "FormPanelController",
    listeners: {
        callSave: "saveNewComponent"
    },
    beforeShow: function(){     
        var me = this;
        me.body.dom.addEventListener("keydown", Ext.bind(onKeyDown, this), false);
        function onKeyDown(e) {
            //Listen for Ctrl+S
            if (e.ctrlKey && e.which === 83){
                e.preventDefault(); 
                me.fireEvent("callSave");
                return false;
            }
        }
    },
    ....
}

Я пробовал много способов добиться этого, это решение было единственным, которое имело правильный контекст, когда фактически находилось внутри контроллера (т.е. эта переменная была правильной)

person Lesley.Oakey    schedule 23.10.2014