Sencha ExtJS5.x 的事件機制講解

ExtJS的組件和類,會在生命周期中調(diào)用一系列的事件独旷,事件允許你自己寫代碼控制你應(yīng)用程序的實際行為县恕,它是ExtJS的一個核心內(nèi)容。

什么是事件岔冀?

事件在你類中感興趣的地方發(fā)生,比如概耻,Ext.Component在渲染到屏幕的時候使套,ExtJS會在渲染完成后通知一個事件。我們可以通過配置一個listeners來監(jiān)聽那個事件鞠柄。

Ext.create('Ext.Panel', {

??? html: 'My Panel',

??? renderTo:Ext.getBody(),

??? listeners: {

??????? afterrender:function() {

???????????Ext.Msg.alert('Success!', 'We have been rendered');

??????? }

??? }

});

在例子中侦高,當(dāng)你點擊preview按鈕的時候,pannel渲染到屏幕厌杜,然后就會執(zhí)行定義好的aler信息奉呛。所有的時間在類的API頁面都有列出计螺,比如,Ext.panel.Panel共有45個監(jiān)聽事件瞧壮。

監(jiān)聽事件

在某些情況下登馒,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!');

??????? }

??? }

});

一個組件可能包含許許多多的事件監(jiān)聽,在下面的代碼中秦忿,我們通過調(diào)用this.hide()方法迷惑用戶麦射,當(dāng)我們鼠標(biāo)滑過的時候,按鈕就隱藏灯谣。一秒后潜秋,再讓它顯示。當(dāng)this.hide()方法調(diào)用的時候酬屉,hide方法就被觸發(fā)半等,hide事件觸發(fā)hide監(jiān)聽揍愁,一秒后讓按鈕顯示呐萨。

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

??????? }

??? }

?});

事件監(jiān)聽在每次觸發(fā)的時候都會被調(diào)用,所以根據(jù)需要你可以不限次的顯示和隱藏按鈕莽囤。

監(jiān)聽后置

在先前的例子中谬擦,我們在組件初始化的時候給組件傳遞了監(jiān)聽,但是如果我們已經(jīng)有一個實例朽缎,我們也可以通過on 事件增加一個監(jiān)聽惨远。

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指定多個監(jiān)聽,跟使用listener監(jiān)聽一個道理话肖,下面跟上面的代碼相反北秽,讓按鈕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);

??? }

});

清除監(jiān)聽

在任何時候我們都可以增加監(jiān)聽,那在任何時候也可以移除監(jiān)聽最筒,使用un功能贺氓,就可以達(dá)到。下面自定義了一個doSomething()方法床蜘,開始定義一個監(jiān)聽辙培,然后三秒后移除監(jiān)聽,開始有事件發(fā)生邢锯,后期因為移除了就不會有事件發(fā)生扬蕊。

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

節(jié)點監(jiān)聽選項

節(jié)點通過你的處理功能設(shè)置值,默認(rèn)是類來觸發(fā)這個事件丹擎,但這不是固定不變的尾抑,上面的例子是在this.hide()方法調(diào)用hide()隱藏按鈕的,下面,我們創(chuàng)建一個按鈕和一個面板再愈,然后監(jiān)聽按鈕的點擊事件庶骄,作用域在面板內(nèi),為了這樣做践磅,需要傳遞一個實例代替一個處理方法单刁,實例包含了一個AND節(jié)點方法:

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

});

當(dāng)然,也可以通過冗余的方式設(shè)置一些監(jiān)聽府适,如果你不需要整體簡潔的話:

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節(jié)點組件的xtype觀察此項檐春。當(dāng)按鈕被點擊的時候我們能看到panel的xtype彈出逻淌。

單次監(jiān)聽

你可能也會想事件只監(jiān)聽發(fā)生一次,事件可能無限次發(fā)生疟暖,但是我們只想監(jiān)聽一次卡儒,下面展示一下:

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配置

當(dāng)頻繁調(diào)用的時候我們可以通過buffer配置減少事件發(fā)生的次數(shù),下面例子展示只有2秒的時候才會觸發(fā)一次事件的:

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

??????????? }

??????? }

??? }

});

監(jiān)聽自定義事件

通過fireEvent調(diào)用自定義的方法俐巴,下面的例子使用了myEvent帶兩個參數(shù)骨望,按鈕本身和1-100之間的隨機數(shù):

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來延遲方法的執(zhí)行,這次是2秒欣舵,當(dāng)事件觸發(fā)的時候擎鸠,myEvent事件就展示傳入進來的參數(shù)。

監(jiān)聽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);

沒有下面的那段代碼绢涡,點擊事件就不會觸發(fā),因為我們把組件的點擊事件綁定到監(jiān)聽器上遣疯,我們就擴展了容器的事件能力雄可。

事件標(biāo)準(zhǔn)化

事件標(biāo)準(zhǔn)化運行ExtJS5+應(yīng)用程序在不同的觸摸設(shè)備(不包括鼠標(biāo)鍵盤燈)上得以運行。事件在底層將事件轉(zhuǎn)換成觸摸設(shè)備支持的類型另锋。

當(dāng)你設(shè)置mosedown事件的時候滞项,在移動設(shè)備就會轉(zhuǎn)換為touchstrt事件:

myElement.on('mousedown',someFunction);

myElement.on('touchstart',someFunction);

而在支持pointerdown的設(shè)備中就會被轉(zhuǎn)換為

myElement.on('pointerdown',someFunction);

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市夭坪,隨后出現(xiàn)的幾起案子文判,更是在濱河造成了極大的恐慌,老刑警劉巖室梅,帶你破解...
    沈念sama閱讀 217,657評論 6 505
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件戏仓,死亡現(xiàn)場離奇詭異疚宇,居然都是意外死亡,警方通過查閱死者的電腦和手機赏殃,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,889評論 3 394
  • 文/潘曉璐 我一進店門敷待,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人仁热,你說我怎么就攤上這事榜揖。” “怎么了抗蠢?”我有些...
    開封第一講書人閱讀 164,057評論 0 354
  • 文/不壞的土叔 我叫張陵举哟,是天一觀的道長。 經(jīng)常有香客問我迅矛,道長妨猩,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 58,509評論 1 293
  • 正文 為了忘掉前任秽褒,我火速辦了婚禮壶硅,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘销斟。我一直安慰自己庐椒,他們只是感情好,可當(dāng)我...
    茶點故事閱讀 67,562評論 6 392
  • 文/花漫 我一把揭開白布票堵。 她就那樣靜靜地躺著扼睬,像睡著了一般逮栅。 火紅的嫁衣襯著肌膚如雪悴势。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 51,443評論 1 302
  • 那天措伐,我揣著相機與錄音特纤,去河邊找鬼。 笑死侥加,一個胖子當(dāng)著我的面吹牛捧存,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播担败,決...
    沈念sama閱讀 40,251評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼昔穴,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了提前?” 一聲冷哼從身側(cè)響起吗货,我...
    開封第一講書人閱讀 39,129評論 0 276
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎狈网,沒想到半個月后宙搬,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體笨腥,經(jīng)...
    沈念sama閱讀 45,561評論 1 314
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,779評論 3 335
  • 正文 我和宋清朗相戀三年勇垛,在試婚紗的時候發(fā)現(xiàn)自己被綠了脖母。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 39,902評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡闲孤,死狀恐怖谆级,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情讼积,我是刑警寧澤哨苛,帶...
    沈念sama閱讀 35,621評論 5 345
  • 正文 年R本政府宣布,位于F島的核電站币砂,受9級特大地震影響建峭,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜决摧,卻給世界環(huán)境...
    茶點故事閱讀 41,220評論 3 328
  • 文/蒙蒙 一亿蒸、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧掌桩,春花似錦边锁、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,838評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至则拷,卻和暖如春贡蓖,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背煌茬。 一陣腳步聲響...
    開封第一講書人閱讀 32,971評論 1 269
  • 我被黑心中介騙來泰國打工斥铺, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人坛善。 一個月前我還...
    沈念sama閱讀 48,025評論 2 370
  • 正文 我出身青樓晾蜘,卻偏偏與公主長得像,于是被迫代替她去往敵國和親眠屎。 傳聞我的和親對象是個殘疾皇子剔交,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 44,843評論 2 354

推薦閱讀更多精彩內(nèi)容