将KeyMaps添加到视口的最佳实践

Ryu*_*yuk 2 extjs extjs4 extjs4.1

什么是创建/绑定KeyMaps到视口的最佳位置?

给出一个非常简单的Viewport,如下所示:

Ext.define('EmptyTemplate.view.Viewport', {
    extend: 'Ext.container.Viewport',
    requires:[
        'Ext.layout.container.Fit',
        'EmptyTemplate.view.Main'
    ],
    layout: {
        type: 'fit'
    },

    items: [{
        xtype: 'app-main'
    }],

    listeners: {
        afterrender: {
            fn: function(){
                // map one key by key code
                this.keyMap = Ext.create('Ext.util.KeyMap', this.el, {
                    scope: this,
                    key: Ext.EventObject.ENTER,
                    fn: function () {
                        console.log("enter pressed");
                    }
                });
            }
        }
    }
});
Run Code Online (Sandbox Code Playgroud)

什么是创建KeyMaps的正确方法?

sra*_*sra 5

首先,一些最佳实践建议:

如果您需要设置组件使用

  • [initComponent][1](你应该阅读详细信息)
  • 另一个提供template methods
  • 在一些罕见的情况下constructor.

在你的情况下,我将使用模板方法afterRender

Ext.define('EmptyTemplate.view.Viewport', {
    extend: 'Ext.container.Viewport',
    requires:[
        'Ext.layout.container.Fit',
        'EmptyTemplate.view.Main'
    ],
    layout: {
        type: 'fit'
    },

    items: [{
        xtype: 'app-main'
    }],

    afterRender: {
        this.callParent(arguments); // always!!
        this.bindKeyMap();
    },

    bindKeyMap: function() {
        var me = this; // use 'me' if 'this' occurs more then 3 times
        if(me.keyMap) {
            me.keyMap.enable();
            return;
        }
        // map one key by key code
        me.keyMap = Ext.create('Ext.util.KeyMap', me.el, {
            scope: me,
            key: Ext.EventObject.ENTER,
            fn: me.onEnter
        });
    },

    unbindKeyMap: function() {
        this.keyMap.disable();
    },

    onDisable: function() {
        this.unbindKeyMap();
        this.callParent(arguments); // always!!
    },

    onEnable: function() {
        this.callParent(arguments); // always!!
        this.bindKeyMap();
    },

    onEnter: function(){
       // i am executed in the scope of the class instance
    }
});
Run Code Online (Sandbox Code Playgroud)

请注意,上面的示例处理整个键映射,但您也可以从映射中添加/删除单个键.

请注意,这是未经测试的原型代码,但它应该以这种方式工作.


如何查找模板方法:

  1. 转到文档
  2. 显示受保护的成员

在此输入图像描述

  1. 寻找 在此输入图像描述 标记

在此输入图像描述

关于覆盖的这篇文章也可能是一个很好的阅读