#extjs #event-handling #listener
#extjs #обработка событий #прослушиватель
Вопрос:
Я использую панель (скажем, parentPanel), имеющую другую дочернюю панель (скажем, childPanel). Как я могу запустить пользовательское событие из дочерней панели, которое будет перехвачено parentPanel?
Ответ №1:
Вот так:
Ext.define('Ext.ux.form.Panel', {
extend: 'Ext.form.Panel',
title: 'Simple Form',
bodyPadding: 5,
width: 350,
layout: 'anchor',
defaults: {
anchor: '100%'
},
defaultType: 'textfield',
initComponent: function() {
var me = this;
me.items = [{
fieldLabel: 'First Name',
name: 'first',
allowBlank: false
}];
me.callParent(arguments);
},
afterRender: function() {
var me = this;
me.callParent(arguments);
// in case of a form you can also use the findField() method
// I used down() because it will work with all sort of containers
me.down('textfield[name=first]').on('change',me.onFirstnameChange,me);
},
onFirstnameChange: function(field) {
// custom handler
}
});
Выполнение этого только для отдельных экземпляров работает одинаково, ожидайте, что вам нужно будет использовать afterrender
событие вместо статического метода шаблона.
Примечание: Если это не соответствует вашим потребностям, вам нужно будет опубликовать более подробный вопрос (с примером кода) для более подробного ответа.
Редактировать:
Добавление пользовательского события в новый компонент:
initComponent: function() {
// ...
me.addEvents('customeventname');
// ...
}
теперь вы можете зарегистрировать прослушиватели для этих событий в экземплярах этого компонента и запустить событие, вызвав, fireEvent('customeventname', args)
где args
указаны аргументы, с которыми вы хотите вызвать каждого прослушивателя.
Комментарии:
1. -Для меня это выглядит нормально. Дело в том, что я не использую предопределенное событие компонентов (‘change’ в вашем примере). Я хочу запустить пользовательское событие в текстовом поле. Пожалуйста, обновите пример с дочерним элементом, имеющим fireEvent()
2. @VVK Хм, я не уверен, правильно ли я вас понял… Я добавил еще немного информации в свой пост. Если это все еще не помогло вам, вам нужно будет предоставить дополнительную информацию. Вы хотите запустить пользовательское событие для нового компонента? Запустите событие самостоятельно от имени другого компонента — если да, то что здесь является триггером?
3. -Спасибо. Кстати, могу ли я перехватить customeventname на панели без добавления прослушивателя в текстовое поле (скажем, у меня много текстовых полей, и я не хочу находить и добавлять прослушиватель в каждое поле).
4. @VVK Нет, вы не можете. Но вы можете создавать всплывающие события, которые затем запускаются целевой точкой пузырька. Затем целевой пузырь может зарегистрироваться в своем собственном событии…