ExtJS5如何让keymap调用viewController函数?

时间:2014-08-08 08:40:42

标签: javascript extjs extjs-mvc extjs5

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

1 个答案:

答案 0 :(得分: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是正确的)