Почнемо з опису обробки подій елементів 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.Observable
mixin. Щоб правильно поводитися з подіями, ваш віджет повинен звертатися 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
віджет - це особливий вид віджетів. Подія натискання може бути призначена цьому віджету за допомогою handler
config:
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();
});