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);

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 160,026评论 4 364
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 67,655评论 1 296
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 109,726评论 0 244
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 44,204评论 0 213
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 52,558评论 3 287
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 40,731评论 1 222
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 31,944评论 2 314
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 30,698评论 0 203
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 34,438评论 1 246
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 30,633评论 2 247
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 32,125评论 1 260
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 28,444评论 3 255
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 33,137评论 3 238
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 26,103评论 0 8
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 26,888评论 0 197
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 35,772评论 2 276
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 35,669评论 2 271

推荐阅读更多精彩内容