Событийные методы

Довольно часто бывает так, что существование у события более чем одного листенера неоправданно, Возьмем, к примеру, событие onRelease, происходящее при отпускании кнопки. Очевидно, что вряд ли какому-то объекту, кроме самой кнопки, может понадобиться знать о нем. В подобных ситуациях использовать описанную ранее модель событий вряд ли стоит. Более технично сделать объект-генератор одновременно и листенером по умолчанию производимого им события. Для этого достаточно при возникновении события отправлять вызов некоторому методу объекта. Связав с этим методом нужную функцию, пользователь сможет реагировать на событие. Возможность же добавлять для данного события дополнительные листенеры реализовывать не стоит (за ненужностью оной).

Метод объекта, который вызывается при возникновении события, о котором должен быть проинформирован только сам объект, мы будем называть событийным методом. В дереве языка в левой части панели Actions событийные методы обычно помещаются в папки Events. Событийных методов несколько меньше, чем обработчиков обычных событий (им соответствуют папки Listeners).

Приведем несколько примеров событийных методов: onSelect класса ContextMenu (активизируется при появлении контекстного меню), onChanged класса TextField (вызывается при изменении пользователем текста в поле ввода), onLoad класса LoadVars (активируется по завершении загрузки внешних данных).

Реализовать событийный метод гораздо проще, чем событие с поддержкой произвольного количества листенеров.


По большому счету все сводится к вызову в нужный момент метода с определен-ным именем, который изначально не определен. Следующий код создает событийный метод onDCIick, который активизируется при двойном щелчке по клипу mov:

// Создайте клип в вице кружочка и назовите его mov
mov.useHandCursor=false; // Отключаем смену вида курсора со стрелки на руку
mov.onPress=function():Void {
// Если щелчок первый, то фиксируем, когда он произошел
if(mov.flag!=true) {
mov.time=getTimer();
mov.flag=true
// Если щелчок второй, то проверяем, сколько времени прошло после первого
// щелчка. Если меньше, чем 300 мс, то вызываем метод onDCIick().
} else if (getTimer()-mov.time <300) {
mov.onDCIick();
mov.flag=false;
} else {
mov.flag=false;
// Проверяем работу событийного метода
mov.onDClick=function():Void {
trace("Произошел двойной щелчок по клипу mov");
}

В какой форме лучше реализовывать собственные события? Все зависит от того, какому количеству объектов они могут быть интересны. Если потенциально может понадобиться несколько обработчиков данного события, то нужно использовать модель Генератор-Листенеры.


Если же событие тесно связано с каким-то конкретным объектом и никому, кроме него, не интересно, то его стоит реализовать в форме событийного метода. Иногда имеет смысл создавать одно и то же событие сразу исходя из обеих моделей. При этом, с одной стороны, сохраняется простота использования событийных методов, а с другой, имеется возможность создания для события нескольких обработчиков. Подобный подход был реализован и в ряде встроенных классов. Для примера можно привести событие onChanged класса TextField.

Оцените статью: (0 голосов)
0 5 0

Статьи из раздела Action Script на эту тему:
Модель событий Flash 5
Модель событий Генератор—Листенеры
Обновление экрана при событиях
Ядром модели событий Генератор – Листенеры Flash MX 2004

Вернуться в раздел: Action Script / 8. События