创建/绑定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的正确方法是什么?
答案 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 单个键。
注意这是未经测试的原型代码,但它应该以这种方式工作。
如何查找模板方法:
This post about overriding也可能是一个很好的阅读