Форум Flasher.ru

Форум Flasher.ru (http://www.flasher.ru/forum/index.php)
-   ActionScript 3.0 (http://www.flasher.ru/forum/forumdisplay.php?f=83)
-   -   Создать пустой Event (http://www.flasher.ru/forum/showthread.php?t=208803)

faraday 31.08.2014 23:17

Создать пустой Event
 
Здравствуйте, в приложении имеется шина событий.
Код AS3:

static public function listenEvent(type:String, callBack:Function) {
events.addEventListener(type, function(e:eventData) {if (e.data) callBack(e.data); else callBack(); } );       
}

Во многих случаях мне не нужна передача аргументов в колбек, поэтому оборачиваю ее в порсредника. Однако удалить такой слушатель не представляется возможным, так как по сути внутри уже другая функция
Код AS3:

static public function offListenEvent(type:String, callBack:Function) {
events.removeEventListener(type, function(e:eventData) {if (e.data) callBack(e.data); else callBack(); });       
}

Можно ли как то обойти эту проблему, или прийдется писать свой EventDispatcher?

GBee 31.08.2014 23:24

Видимо отказаться от анонимок, либо сохранять ссылку на них. Либо и то и другое.
А что мешает отдавать e.data даже если ее нет и проверять уже в колбеке, что пришло?

faraday 31.08.2014 23:36

А как тут можно отказаться от анонимок? все равно колбек надо передавать.
Мешает в каждый колбек писать что на выходе поступает ивент, пускай даже если его занулить в сигнатуре. все равно не вижу смысла того что передается ивент туда где он не нужен.

GBee 01.09.2014 00:02

Цитата:

А как тут можно отказаться от анонимок? все равно колбек надо передавать.
Создавать объектик, который содержит обработчик. Это же классика.
Цитата:

Мешает в каждый колбек писать что на выходе поступает ивент, пускай даже если его занулить в сигнатуре. все равно не вижу смысла того что передается ивент туда где он не нужен.
Код AS3:

if(callBack.length > 0)
    callBack(e.data);
else
    callBack();


faraday 01.09.2014 03:37

какой объектик? можно поподробнее? в этом объектике каждый раз будет новый обработчик? как можно солслаться при remove именно на него?

gloomyBrain 01.09.2014 09:45

На мой взгляд, "шиной" назвать приведенное решение нельзя. Шина - это объект, который рассылает все события всем получателям. В данном же случае я вижу контейнер для слушателей, который не несет никакой практической пользы по сравнению с объявлением обработчиков как приватных методов (здесь же они безосновательно сделаны анонимными функциями и вызывают только проблемы). Отсюда возникает вопрос - почему выбрано именно такое решение? Может быть есть смысл привести здесь проблему, которая решается с помощью "шины"?

Котяра 01.09.2014 10:51

Самая простая шина
Код AS3:

public class EventBus {
    public static const dispatcher:EventDispatcher = new EventDispatcher();
}

Использование:
Код AS3:

EventBus.dispatcher.addEventListener 
EventBus.dispatcher.dispatchEvent
EventBus.dispatcher.removeEventListener

Добавлено через 5 минут
Иногда я добавляю в EventBus метод
Код AS3:

public static dispatch(type:String):Boolean {
if (dispatcher.hasEventListener(type){
  return dispatcher.dispatchEvent(new Event(type));
}
return false;
}


faraday 01.09.2014 13:22

gloomyBrain, если я правильно понял вопрос - то такой анонимный обработтчик используется, как уже писал. чтобы не во все колбеки слался объект eventData, а только куда нужно. Когда общий контейнер важно получать объект, только если в нем информация.
Котяра, да это именно eventBus
Сейчас сделал временный вариант, с дополнительным аргументом на удаляемость
Код AS3:

                static public function listenEvent(type:String, callBack:Function, removable:Boolean = false) {
                if (removable)
                events.addEventListener(type,callBack);
                else
                events.addEventListener(type, function(e:eventData) {if (e.data) callBack(e.data); else callBack(); } );       
                }
                static public function offListenEvent(type:String, callBack:Function) {
                events.removeEventListener(type, callBack);       
                }

Конечно весьма костыльный, так что если останется единсввенный вариант в передаче всего объекта Event при каждом событии - сделаю так.


Часовой пояс GMT +4, время: 18:54.

Copyright © 1999-2008 Flasher.ru. All rights reserved.
Работает на vBulletin®. Copyright ©2000 - 2026, Jelsoft Enterprises Ltd. Перевод: zCarot
Администрация сайта не несёт ответственности за любую предоставленную посетителями информацию. Подробнее см. Правила.