как передать параметр в слушатель
Достаточно быстро накидал, могут быть ошибки/неточности, опечатки, чего-то не хватать, постараюсь дополнить.
Часто бывает просто написать некую функцию paramFunc, которой передается номер кнопки, а не обьект собственно кнопки. Почти всё тут про, "как сопоставить обьекту (event.currentTarget) параметр".
Надо помнить, что addEventListener позволяет повесить сколько угодно слушателей, нижеприведённые методы, почти все - только один (обычно больше одного и не надо, но если забыть - могут быть ошибки). Тут всё скорее про мышиные события, с таймерами и др. могут быть особенности.
1. if/switch
Если кнопок мало и они создаются не динамически, то
public function listener(event:MouseEvent):void { if(event.currentTarget == myBtn1) { paramFunc(0); } else if(event.currentTarget == myBtn2) { paramFunc(1); } } public function listener(event:MouseEvent):void { switch(event.currentTarget) { case myBtn1: paramFunc(0); break; ... } } public function listener(event:MouseEvent):void { var myBtns:Array = [myBtn1, myBtn2, myBtn3]; for(var i:int = 0; i < myBtns.length; ++i) { if(event.currentTarget == myBtns[i]) { paramFunc(i); break; } } }
Достаточно универсальный способ, создание и работа с Dictionary единственное "лишнее" действие. На его основе можно написать даже свой addEventListener, в который передается параметр (может позже осилю).
Это класс, который обрабатывает только MouseEvent.CLICK.
Использовать - вместо obj.addEventListener(MouseEvent.CLICK, listener) писать
ClickClass.addClickListener(obj, listener, param);
public class ClickClass { public static var paramDict:Dictionary = new Dictionary(true); public static function addClickListener(obj:InteractiveObject, listener:Function, myParam:*, useCapture:Boolean = false, priority:int = 0, useWeakReference:Boolean = true):void { paramDict[obj] =[listener, myParam]; obj.addEventListener(MouseEvent.CLICK, clickHandler, useCapture, priority, useWeakReference); } public static function myRemoveClickListener(obj:InteractiveObject, useCapture:Boolean = false):Boolean { if(paramDict[obj]) { obj.removeEventListener(MouseEvent.CLICK, obj, useCapture); delete paramDict[obj]; return true; } return false; } public static function clickHandler(event:MouseEvent):void { if(paramDict[event.currentTarget][0]) { paramDict[event.currentTarget][0](paramDict[event.currentTarget][1]); } } }
Если (почти) все обьекты класса заинтересованы в том, чтоб вызывать слушатель с параметром (напр. кнопки), то стоит сделать у класса новое поле, в котором будет храниться этот самый параметр. Хороший метод, но не всегда классу нужно и логично иметь такое поле. А иногда и собственного класса нет, просто спрайт. Но можно, конечно, сделать свой спрайт, с параметром, как ниже.
использование
myBtnButton.btnParam = i; myBtnButton.addEventListener(MouseEvent.CLICK, clickProxy); ... public function clickProxy(event:MouseEvent):void { paramFunc(event.currentTarget.btnParam); }
Анонимные функции - зло. Жрут память (с их убиранием есть проблемы, в примере), тормозят, если в них свалиться, то не узнать их имени, плохой стиль и многое другое. Пример (не используйте его, тут нельзя удалить эту функцию).
obj.addEventListener(MouseEvent.CLICK, function listener(ev:MouseEvent):void {paramFunc(i);});
5. custom event
Создается класс, который расширяет Event и в котором есть параметр. Только флэш не умеет вместо MouseEvent (или другого своего "родного") события использовать ваше, так что придётся в обработчике, созданном одним из вышеуказанных способов потом самому диспатчить событие.
Если вам более привычна событийная модель. Плюс на событие может быть навешено сколько угодно слушателей.
Всего комментариев 64
Комментарии
01.10.2011 19:25 | |
почему люди так сильно любят анальные извращения?
|
04.10.2011 01:51 | |
Цитата:
почему люди так сильно любят анальные извращения?
|
04.10.2011 10:25 | |
04.10.2011 12:29 | |
dimarik, а Вы это к чему?
|
04.10.2011 20:26 | |
Правда, красиво? )
|
04.10.2011 21:16 | |
=) Правда, в трейсе должно быть --param
|
04.10.2011 22:38 | |
Все верно написано. Постфиксный инкремент. Что тебя смутило?
|
04.10.2011 23:01 | |
То что в трейс выведется значение до операции, а не ее результат
|
05.10.2011 09:52 | |
Верно. Именно этого я и добивался. Декремент, конечно.
|
25.03.2014 15:13 | |
25.03.2014 22:42 | |
Надо.
|
13.03.2015 14:05 | |
4 способ немного расширяет вот это пример https://jadendreamer.wordpress.com/2...ent-listeners/ Наткнулся недавно, и решил сюда скинуть, дополнить))
|
Последние записи от -De-
- Про память, занимаемую Object и Array и что такое Array (28.08.2011)
- Isometric sorting (23.05.2011)
- разбиралка мат. выражений (28.12.2010)
- как передать параметр в слушатель (14.09.2010)