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

时间:2014-12-13 21:11:12

标签: 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");
                    }
                });
            }
        }
    }
});

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

1 个答案:

答案 0 :(得分:5)

首先,一些最佳做法建议:

如果您需要使用

设置组件
  • [initComponent][1](您应该read this了解详细信息),
  • 另一个提供了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
    }
});

请注意,上面的示例处理整个键盘映射,但您也可以从地图中 add / remove 单个键。

  

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


如何查找模板方法

  1. 转到docs
  2. 显示受保护的成员
  3. enter image description here

    1. 查找enter image description here标记
    2. enter image description here

      This post about overriding也可能是一个很好的阅读