Форум Flasher.ru

Форум Flasher.ru (http://www.flasher.ru/forum/index.php)
-   ActionScript 3.0 (http://www.flasher.ru/forum/forumdisplay.php?f=83)
-   -   Получение информации от dispatchEvent. (http://www.flasher.ru/forum/showthread.php?t=206923)

dendead 13.03.2014 20:23

Получение информации от dispatchEvent.
 
Доброго времени суток. Есть подобие магазина, из которого диспатчаться события, при нажатии на кнопку товара.

На данный момент я прописываю в классе Shop для каждого из товаров:

Код AS3:

public static const BUY_MEET:String = "meet";
public static const BUY_GRASS:String = "grass";
public static const BUY_CARROT:String = "carrot";

Проверяю какая кнопка нажата и диспатчу соответствующее событие:

Код AS3:

private function foodBtnMouseDown(e:MouseEvent):void {   // обрабатывает события мыши
 var newName:String = String(e.currentTarget);
 var nameObj:String = newName.substring(8, (newName.length - 2));
 switch(nameObj) {
 case "Meet":
        dispatchEvent(new Event(BUY_MEET));
 break;
 case "Grass":
        dispatchEvent(new Event(BUY_GRASS));
 break;
 case "Carrot":
        dispatchEvent(new Event(BUY_CARROT));
 break;
 }
}

События регистрируются в другом классе, на созданный в нём экземпляр класса магазина, где они и ловятся:

Код AS3:

shop.addEventListener(Shop.BUY_MEET, buy);
shop.addEventListener(Shop.BUY_GRASS, buy);
shop.addEventListener(Shop.BUY_CARROT, buy);

Когда товаров в магазине несколько штук, такой подход вполне подходит, но если их там становится больше сотни... Возникает вопрос: каким образом можно диспатчить одно событие на все товары магазина (например: dispatchEvent(new Event(BUY))), при этом передавая в нём информацию о том, какая кнопка в магазине нажата?

Можно отправлять эту информацию через аргументы в функцию, но нужно именно dispatch'ом.

Akopalipsis 13.03.2014 20:36

Присвойте свойствам имен значение констант и тогда получится -
Код AS3:

private function foodBtnMouseDown(e:MouseEvent):void {   // обрабатывает события мыши
 var newName:String = String(e.currentTarget);
 var nameObj:String = newName.substring(8, (newName.length - 2));
 dispatchEvent(new Event(nameObj));
}


dendead 13.03.2014 20:43

Всё было так просто. Большое спасибо, Akopalipsis!

КорДум 13.03.2014 20:43

Воспользуйтесь кастомными событиями и передавайте необходимую информацию внутри.

dendead 13.03.2014 20:53

КорДум, подскажите пожалуйста как можно передать через кастомное событие что-то?

КорДум 13.03.2014 20:59

Вот, например, первая ссылка в гугле:
http://stackoverflow.com/questions/1...added-data-as3

dendead 13.03.2014 21:27

КорДум, Спасибо.

KumoKairo 13.03.2014 21:37

Ту ту руу! Человек-сигнал спешит на помощь!
Посоветую самый простой способ передавать параметры со своими событиями - СИГНАЛЫ

СлаваRa 13.03.2014 21:49

Это довольно непростой способ, который при попытке получить "функционал баблинга" создает много проблем.
ТС, же проще использовать Dictionary, [button => eventType]

caseyryan 13.03.2014 21:50

Цитата:

Посоветую самый простой способ передавать параметры со своими событиями
Не самый простой вариант. С ними разобраться сложнее, чем с событиями
Как по мне, так эти сигналы вообще фигня какая-то

KumoKairo 13.03.2014 23:00

Я с кастомными событиями мучился до того самого момента, пока не наткнулся на сигналы)
Разбираться с ними - плевое дело, один пятиминутный тутор и ты уже good to go, никаких заморочек.

Опять же, это дело вкуса и привычки. :)
Для полноты картины и кругозора, вдруг понравится

dimarik 13.03.2014 23:38

Цитата:

Сообщение от Akopalipsis (Сообщение 1161686)
Присвойте свойствам имен значение констант и тогда получится -
Код AS3:

private function foodBtnMouseDown(e:MouseEvent):void {   // обрабатывает события мыши
 var newName:String = String(e.currentTarget);
 var nameObj:String = newName.substring(8, (newName.length - 2));
 dispatchEvent(new Event(nameObj));
}


Код AS3:

var newName:String = String(e.currentTarget);

Как ты считаешь, что вернет в newName от дефолтного Object.toString() для объектов классов foo.Bar и foobar.Bar?

Чудак, ты вообще думаешь, что делаешь? У меня такое желание дать тебе третий плюс и распрощаться. Навсегда.

dimarik 13.03.2014 23:58

Сорри, до завершения расследования я тебя пока блокну.

Добавлено через 13 минут
Цитата:

Сообщение от caseyryan (Сообщение 1161700)
Не самый простой вариант. С ними разобраться сложнее, чем с событиями
Как по мне, так эти сигналы вообще фигня какая-то

Сигналы... Вот немного пытался разобраться, но хочу прислушаться к твоему мнению.
Как считаешь, сигналы дают прирост к производительности против обычных эвентов?

KumoKairo 14.03.2014 00:45

Performance test
Performance test 1
Pro and Cons
Но Joshua в свое время отказался от as3-signals в пользу старых событий Starling (речь идет о кастомных самописных события Starling, а не нативных событий с клонированием), но только ссылаясь на то, что Starling события с функцией .dispatchEventWith(...) полностью заменяет логику сигналов (Этот метод действительно очень ХАРОШ).
http://forum.starling-framework.org/...o-more-signals

Еще раз - я не говорю что все поголовно срочно должны перейти на сигналы, никого не принуждаю и не утверждаю, что это едиственно верный способ программирования. Свой пост я написал больше для создания более общей картины, потому что эта библиотека стоит того, чтобы (просто) обратить на нее внимание.

Если нужен баблинг - стандартные события выигрывают по семантике.

Сигналы - это примерный аналог системы событий в C#. Кто-то на форуме говорил, что делать C# из AS3 крайне неэтично и прочее, но опять же, все зависит от конкретного человека и конкретного случая)
В моем случае - мне очень нравится система событий и делегатов C#, поэтому когда я использовал AS3 - сигналы стали для меня просто спасением (до этого я делал кастомные события). Можно считать это приступом программистского эскапизма от реалий конкретного языка.

Доказывать ничего не собираюсь (и не собирался), инет и так полон обсуждений. Можно нагуглить много инфы по запросу as3 signals vs events, там все косточки уже аккуратно пересчитаны и пересобраны :)

СлаваRa 14.03.2014 01:18

Цитата:

Сообщение от dimarik (Сообщение 1161711)
Как считаешь, сигналы дают прирост к производительности против обычных эвентов?

Да, дают(проверенно), но создают проблемы:
- на каждый сигнал отдельное поле
- евенты любого типа можно "стрелять" от наследников евент диспатчера, сигналы или от супера(+п1) или каждый раз создавать для каждой сущности
- "поведение баблинга" реализуется через "мягкое место"
- не будет поддержки от IDE(хотя это уже сахар) с метой и т.п.

@KumoKario
Цитата:

Сигналы - это примерный аналог системы событий в C#.
Вы, видимо, очень плохо с C#.

dimarik 14.03.2014 01:48

А не напомните ли основную идею сигналов?

И спасибо за отклики. Кто-нибудь тестировал производительность сигналов vs. событий по Adobe Scоut на мобилке, с оглядкой на расход памяти? И проблемы, затронутые СлаваRa не создадут ли принципиальный барьер для архитектуры?

СлаваRa 14.03.2014 02:11

Дим, могу тебе скинуть все и вся по ним, в плане тестов и работы, затронут и архитектуру и прочее, насколько я знаю.
Наши с тобой подходы не подходят.

Выигрыш будет в единичных случая, в целом нет.

dimarik 14.03.2014 02:18

Слав, хочу, однозначно. Сидувай.

Isfet 14.03.2014 06:11

по теме, как по мне, то я бы в кнопке хранил строку ("meet" или "grass" или "carrot"), и в кнопке же сделал функцию которая бы возвращала эту строку , а в хендлере написал бы что-то вроде
Код AS3:

private function foodBtnMouseDown(e:MouseEvent):void {   // обрабатывает события мыши
 
    if(e.target is FoodButton){
          var btnStr:String = (e.target as FoodButton).getFoodName(); // витаскиваем имя еды из нажатой кнопки
 
          //дальше пошел case
    }
}


dimarik 19.03.2014 21:26

По сути, достаточно хорошее обмусоливание вынесено в статьи.
Форум Flasher.ru > Flash > ActionScript 3.0 > Статьи > Слушатель с параметром

etc 20.03.2014 02:50

Цитата:

Сообщение от Akopalipsis (Сообщение 1161686)
Присвойте свойствам имен значение констант и тогда получится -
Код AS3:

private function foodBtnMouseDown(e:MouseEvent):void {   // обрабатывает события мыши
 var newName:String = String(e.currentTarget);
 var nameObj:String = newName.substring(8, (newName.length - 2));
 dispatchEvent(new Event(nameObj));
}


В 2014-ом году кто-то ещё так колхозит оказывается.
А как же мощнейший механизм наследования, а?

maincode 20.03.2014 19:28

Цитата:

Сообщение от dendead (Сообщение 1161691)
КорДум, подскажите пожалуйста как можно передать через кастомное событие что-то?

Кастомные события


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

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