Почнемо з опису обробки подій елементів DOM.
Обробка події у вузлі DOM
Перш за все, ви не хочете працювати безпосередньо з вузлом DOM. Натомість ви, ймовірно, хотіли б використовувати Ext.Elementінтерфейс. З метою призначення обробників подій було створено Element.addListenerта Element.on(вони еквівалентні). Так, наприклад, якщо у нас є html:
<div id="test_node"></div>
і ми хочемо додати clickобробник подій.
Давайте відновимо Element:
var el = Ext.get('test_node');
Тепер перевіримо документи на clickподію. У його обробника може бути три параметри:
клацніть (Ext.EventObject e, HTMLElement t, Object eOpts)
Знаючи все це, ми можемо призначити обробника:
// event name event handler
el.on( 'click' , function(e, t, eOpts){
// handling event here
});
Обробка подій віджетів
Обробка подій віджетів майже схожа на обробку подій на вузлах DOM.
Перш за все, обробка подій віджетів здійснюється за допомогою Ext.util.Observablemixin. Щоб правильно поводитися з подіями, ваш віджет повинен звертатися Ext.util.Observableяк міксин. Усі вбудовані віджети (такі як Panel, Form, Tree, Grid, ...) Ext.util.Observableза замовчуванням мають як міксин.
Для віджетів існує два способи призначення обробників. Перший - це використовувати за методом (або addListener). Для прикладу створимо Buttonвіджет і призначимо йому clickподію. Перш за все, слід перевірити документи події на наявність аргументів обробника:
натисніть (Ext.button. Запустіть це, Event e, Object eOpts)
Тепер скористаємося on:
var myButton = Ext.create('Ext.button.Button', {
text: 'Test button'
});
myButton.on('click', function(btn, e, eOpts) {
// event handling here
console.log(btn, e, eOpts);
});
Другий спосіб - використовувати конфігурацію слухачів віджетів :
var myButton = Ext.create('Ext.button.Button', {
text: 'Test button',
listeners : {
click: function(btn, e, eOpts) {
// event handling here
console.log(btn, e, eOpts);
}
}
});
Зауважте, що Buttonвіджет - це особливий вид віджетів. Подія натискання може бути призначена цьому віджету за допомогою handlerconfig:
var myButton = Ext.create('Ext.button.Button', {
text: 'Test button',
handler : function(btn, e, eOpts) {
// event handling here
console.log(btn, e, eOpts);
}
});
Спеціальні стрільби подій
Перш за все вам потрібно зареєструвати подію методом addEvents :
myButton.addEvents('myspecialevent1', 'myspecialevent2', 'myspecialevent3', /* ... */);
Використання addEventsметоду необов’язкове. Як зазначають коментарі до цього методу, немає необхідності використовувати цей метод, але він забезпечує місце для документації подій.
Щоб запустити вашу подію, використовуйте метод fireEvent :
myButton.fireEvent('myspecialevent1', arg1, arg2, arg3, /* ... */);
arg1, arg2, arg3, /* ... */буде передано в обробник. Тепер ми можемо вирішити вашу подію:
myButton.on('myspecialevent1', function(arg1, arg2, arg3, /* ... */) {
// event handling here
console.log(arg1, arg2, arg3, /* ... */);
});
Варто зазначити, що найкращим місцем для вставки виклику методу addEvents є метод віджетів, initComponentколи ви визначаєте новий віджет:
Ext.define('MyCustomButton', {
extend: 'Ext.button.Button',
// ... other configs,
initComponent: function(){
this.addEvents('myspecialevent1', 'myspecialevent2', 'myspecialevent3', /* ... */);
// ...
this.callParent(arguments);
}
});
var myButton = Ext.create('MyCustomButton', { /* configs */ });
Запобігання бурхливості подій
Для запобігання барботажу ви можете return falseабо використовувати Ext.EventObject.preventDefault(). З метою запобігання використанню дій за промовчанням браузера Ext.EventObject.stopPropagation().
Наприклад, давайте призначити обробник подій клацання нашій кнопці. І якщо не натиснули ліву кнопку, запобігайте дії браузера за замовчуванням:
myButton.on('click', function(btn, e){
if (e.button !== 0)
e.preventDefault();
});