Sencha ExtJS5.x 的事件机制讲解
ExtJS的组件和类,会在生命周期中调用一系列的事件,事件允许你自己写代码控制你应用程序的实际行为,它是ExtJS的一个核心内容。
什么是事件?
事件在你类中感兴趣的地方发生,比如,Ext.Component在渲染到屏幕的时候,ExtJS会在渲染完成后通知一个事件。我们可以通过配置一个listeners来监听那个事件。
Ext.create('Ext.Panel', {
html: 'My Panel',
renderTo:Ext.getBody(),
listeners: {
afterrender:function() {
Ext.Msg.alert('Success!', 'We have been rendered');
}
}
});
在例子中,当你点击preview按钮的时候,pannel渲染到屏幕,然后就会执行定义好的aler信息。所有的时间在类的API页面都有列出,比如,Ext.panel.Panel共有45个监听事件。
监听事件
在某些情况下,Ext.Component#event-afterrender是非常有用的,其它,比如Ext.button.Button的click事件。
Ext.create('Ext.Button', {
text: 'Click Me',
renderTo:Ext.getBody(),
listeners: {
click: function(){
Ext.Msg.alert('Success!', 'I was clicked!');
}
}
});
一个组件可能包含许许多多的事件监听,在下面的代码中,我们通过调用this.hide()方法迷惑用户,当我们鼠标滑过的时候,按钮就隐藏。一秒后,再让它显示。当this.hide()方法调用的时候,hide方法就被触发,hide事件触发hide监听,一秒后让按钮显示。
Ext.create('Ext.Button', {
renderTo:Ext.getBody(),
text: 'My Button',
listeners: {
mouseover:function() {
this.hide();
},
hide: function(){
// Waits 1second (1000ms), then shows the button again
Ext.defer(function(){
this.show();
}, 1000,this);
}
}
});
事件监听在每次触发的时候都会被调用,所以根据需要你可以不限次的显示和隐藏按钮。
监听后置
在先前的例子中,我们在组件初始化的时候给组件传递了监听,但是如果我们已经有一个实例,我们也可以通过on 事件增加一个监听。
var button = Ext.create('Ext.Button', {
renderTo:Ext.getBody(),
text: 'My Button'
});
button.on('click', function() {
Ext.Msg.alert('Success!','Event listener attached by .on');
});
也可以通过on指定多个监听,跟使用listener监听一个道理,下面跟上面的代码相反,让按钮show:
var button = Ext.create('Ext.Button', {
renderTo:Ext.getBody(),
text: 'My Button'
});
button.on({
mouseover: function(){
this.hide();
},
hide: function() {
Ext.defer(function() {
this.show();
}, 1000, this);
}
});
清除监听
在任何时候我们都可以增加监听,那在任何时候也可以移除监听,使用un功能,就可以达到。下面自定义了一个doSomething()方法,开始定义一个监听,然后三秒后移除监听,开始有事件发生,后期因为移除了就不会有事件发生。
var doSomething = function() {
Ext.Msg.alert('listener called');
};
var button = Ext.create('Ext.Button', {
renderTo:Ext.getBody(),
text: 'My Button',
listeners: {
click:doSomething,
}
});
Ext.defer(function() {
button.un('click',doSomething);
}, 3000);
节点监听选项
节点通过你的处理功能设置值,默认是类来触发这个事件,但这不是固定不变的,上面的例子是在this.hide()方法调用hide()隐藏按钮的,下面,我们创建一个按钮和一个面板,然后监听按钮的点击事件,作用域在面板内,为了这样做,需要传递一个实例代替一个处理方法,实例包含了一个AND节点方法:
var panel = Ext.create('Ext.Panel', {
html: 'Panel HTML'
});
var button = Ext.create('Ext.Button', {
renderTo:Ext.getBody(),
text: 'Click Me'
});
button.on({
click: function() {
Ext.Msg.alert('Success!', this.getXType());
},
scope: panel
});
当然,也可以通过冗余的方式设置一些监听,如果你不需要整体简洁的话:
var panel = Ext.create('Ext.Panel', {
html: 'Panel HTML'
});
var button = Ext.create('Ext.Button', {
renderTo:Ext.getBody(),
text: 'Click Me'
});
button.on({
click: {
scope: panel,
fn: function() {
Ext.Msg.alert('Success!', this.getXType());
}
}
});
运行后,点击事件的this就是代表的panel了,我们可以通过alert节点组件的xtype观察此项。当按钮被点击的时候我们能看到panel的xtype弹出。
单次监听
你可能也会想事件只监听发生一次,事件可能无限次发生,但是我们只想监听一次,下面展示一下:
var button = Ext.create('Ext.Button', {
renderTo:Ext.getBody(),
text: 'Click Me',
listeners: {
click: {
single: true,
fn:function() {
Ext.Msg.alert('Success!','I will say this only once');
}
}
}
});
使用Buffer配置
当频繁调用的时候我们可以通过buffer配置减少事件发生的次数,下面例子展示只有2秒的时候才会触发一次事件的:
var button = Ext.create('Ext.Button', {
renderTo:Ext.getBody(),
text: 'Click Me',
listeners: {
click: {
buffer: 2000,
fn: function() {
Ext.Msg.alert('Success!','I say this only once every 2 seconds');
}
}
}
});
监听自定义事件
通过fireEvent调用自定义的方法,下面的例子使用了myEvent带两个参数,按钮本身和1-100之间的随机数:
var button = Ext.create('Ext.Button', {
renderTo:Ext.getBody(),
text: "Just wait2 seconds",
listeners: {
myEvent:function(button, points) {
Ext.Msg.alert('Success!','myEvent fired! You score ' + points + 'points');
}
}
});
Ext.defer(function() {
var number =Math.ceil(Math.random() * 100);
button.fireEvent('myEvent', button, number);
}, 2000);
又使用了一次Ext.defer来延迟方法的执行,这次是2秒,当事件触发的时候,myEvent事件就展示传入进来的参数。
监听DOM事件
并不是所有的ExtJS组件都有所有的事件,但是通过绑定到文档中,我们可以手动的给它添加一个事件,Ext.containner.Contener没有click事件,我们可以给定它一个:
var container = Ext.create('Ext.Container', {
renderTo:Ext.getBody(),
html: 'Click Me!',
listeners: {
click:function(){
Ext.Msg.alert('Success!', 'I have been clicked!')
}
}
});
container.getEl().on('click', function(){
this.fireEvent('click', container);
}, container);
没有下面的那段代码,点击事件就不会触发,因为我们把组件的点击事件绑定到监听器上,我们就扩展了容器的事件能力。
事件标准化
事件标准化运行ExtJS5+应用程序在不同的触摸设备(不包括鼠标键盘灯)上得以运行。事件在底层将事件转换成触摸设备支持的类型。
当你设置mosedown事件的时候,在移动设备就会转换为touchstrt事件:
myElement.on('mousedown',someFunction);
myElement.on('touchstart',someFunction);
而在支持pointerdown的设备中就会被转换为
myElement.on('pointerdown',someFunction);