0

我想知道如何从 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'
        }
    ]
});
4

1 回答 1

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;
            }
        }
    },
    ....
}

我尝试了很多方法来实现这一点,这个解决方案是唯一一个在控制器内部实际具有正确上下文的解决方案(即这个var 是正确的)

于 2014-10-23T12:40:25.553 回答