Форум Flasher.ru
Ближайшие курсы в Школе RealTime
Список интенсивных курсов: [см.]  
  
Специальные предложения: [см.]  
  
 
Блоги Правила Справка Пользователи Календарь Поиск рулит! Сообщения за день Все разделы прочитаны
 

Вернуться   Форум Flasher.ru > Блоги > -De-

Рейтинг: 2.67. Голосов: 3.

как передать параметр в слушатель

Запись от -De- размещена 14.09.2010 в 13:20
Обновил(-а) -De- 14.09.2010 в 15:42

Достаточно быстро накидал, могут быть ошибки/неточности, опечатки, чего-то не хватать, постараюсь дополнить.
Часто бывает просто написать некую функцию paramFunc, которой передается номер кнопки, а не обьект собственно кнопки. Почти всё тут про, "как сопоставить обьекту (event.currentTarget) параметр".
Надо помнить, что addEventListener позволяет повесить сколько угодно слушателей, нижеприведённые методы, почти все - только один (обычно больше одного и не надо, но если забыть - могут быть ошибки). Тут всё скорее про мышиные события, с таймерами и др. могут быть особенности.
1. if/switch
Если кнопок мало и они создаются не динамически, то
Код AS3:
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;
    }
  }
}
2. Dictionary
Достаточно универсальный способ, создание и работа с Dictionary единственное "лишнее" действие. На его основе можно написать даже свой addEventListener, в который передается параметр (может позже осилю).
Это класс, который обрабатывает только MouseEvent.CLICK.
Использовать - вместо obj.addEventListener(MouseEvent.CLICK, listener) писать
ClickClass.addClickListener(obj, listener, param);
Код AS3:
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]);
	  }
	}
}
3. class field
Если (почти) все обьекты класса заинтересованы в том, чтоб вызывать слушатель с параметром (напр. кнопки), то стоит сделать у класса новое поле, в котором будет храниться этот самый параметр. Хороший метод, но не всегда классу нужно и логично иметь такое поле. А иногда и собственного класса нет, просто спрайт. Но можно, конечно, сделать свой спрайт, с параметром, как ниже.
Код AS3:
class MyBtn extends Sprite {
  public var btnParam:int;
}
использование
Код AS3:
myBtnButton.btnParam = i;
myBtnButton.addEventListener(MouseEvent.CLICK, clickProxy);
...
public function clickProxy(event:MouseEvent):void {
  paramFunc(event.currentTarget.btnParam);
}
4. anonymous func
Анонимные функции - зло. Жрут память (с их убиранием есть проблемы, в примере), тормозят, если в них свалиться, то не узнать их имени, плохой стиль и многое другое. Пример (не используйте его, тут нельзя удалить эту функцию).
Код AS3:
obj.addEventListener(MouseEvent.CLICK, function listener(ev:MouseEvent):void {paramFunc(i);});
Причем тут если i - переменная цикла, то передастся только последнее значение. Т.к. i в нашей функции именно та самая, что в цикле, и меняется вместе с циклом. Можно сделать отдельную функцию, которая возвращает новосозданную анонимную функцию. В общем, пока смысл этого раздела "не используйте анонимные функции и даже нормального примера не будет".
5. custom event
Создается класс, который расширяет Event и в котором есть параметр. Только флэш не умеет вместо MouseEvent (или другого своего "родного") события использовать ваше, так что придётся в обработчике, созданном одним из вышеуказанных способов потом самому диспатчить событие.
Если вам более привычна событийная модель. Плюс на событие может быть навешено сколько угодно слушателей.
Всего комментариев 64

Комментарии

Старый 01.10.2011 13:35 incvizitor вне форума
incvizitor
 
Аватар для incvizitor
Цитата:
А теперь так же, но вне тела listener
Вообще такая возможность есть, с помощью *****кода. (дальше читать только в случае, если Вы уверены что никогда так не будете делать) :

Код AS3:
package core {
	import flash.display.Sprite;
	import flash.events.Event;
	import flash.utils.setTimeout;
 
	public class Main extends Sprite {
 
		private var _listener:Function;
 
		public function Main():void {
			if (stage) init();
			else addEventListener(Event.ADDED_TO_STAGE, init);
		}
 
		private function init(e:Event = null):void {
			removeEventListener(Event.ADDED_TO_STAGE, init);
			// entry point
			var _t:uint = setTimeout(_clearEnterfame, 500);
			addEventListener(Event.ENTER_FRAME, function listener():void { _listener = arguments.callee; trace("enter frame"); } );
		}
 
		private function _clearEnterfame():void{
			if(_listener) removeEventListener(Event.ENTER_FRAME, _listener);
		}
 
	}
 
}
Старый 01.10.2011 19:25 BlooDHounD вне форума
BlooDHounD
 
Аватар для BlooDHounD
почему люди так сильно любят анальные извращения?
Старый 01.10.2011 22:06 incvizitor вне форума
incvizitor
 
Аватар для incvizitor
BlooDHounD, вообще то я и написал что так делать не надо. Я просто сказал, что теоретически такое возможно. Точно так же как человек, в принципе может взять и выпить яду, но вряд ли это хорошая идея. Примером я как раз и хотел показать, что стараясь сделать проще (в данном случае), получается только каша и еще большие нагромождения. А для тех, кто этого не понял, я объяснил открытым текстом.
Старый 04.10.2011 01:51 in4core вне форума
in4core
 
Аватар для in4core
Цитата:
почему люди так сильно любят анальные извращения?
Не всем достаточно 2х не занятых отверстий у женщин, кто то любит еще и разнообразие, обладая немалой фантазией))))
Старый 04.10.2011 10:25 dimarik вне форума
dimarik
 
Аватар для dimarik
Оле-оле-оле-оле!
Код AS3:
var param:uint = 10;
super.addEventListener(
	Event.ENTER_FRAME,
	function(dispatcher:IEventDispatcher):Function {
		return function(event:Event):void {
			trace('param', param--);
			if (!param)
				dispatcher.removeEventListener(event.type, arguments.callee);
		}
	}(this)
);
Старый 04.10.2011 12:29 incvizitor вне форума
incvizitor
 
Аватар для incvizitor
dimarik, а Вы это к чему?
Старый 04.10.2011 20:26 dimarik вне форума
dimarik
 
Аватар для dimarik
Правда, красиво? )
Старый 04.10.2011 21:16 gloomyBrain вне форума
gloomyBrain
 
Аватар для gloomyBrain
=) Правда, в трейсе должно быть --param
Старый 04.10.2011 22:38 dimarik вне форума
dimarik
 
Аватар для dimarik
Все верно написано. Постфиксный инкремент. Что тебя смутило?
Старый 04.10.2011 23:01 gloomyBrain вне форума
gloomyBrain
 
Аватар для gloomyBrain
То что в трейс выведется значение до операции, а не ее результат
Старый 05.10.2011 09:52 dimarik вне форума
dimarik
 
Аватар для dimarik
Верно. Именно этого я и добивался. Декремент, конечно.
Старый 25.03.2014 15:13 Bred45 вне форума
Bred45
В пункте 2, в строке
Код AS3:
obj.removeEventListener(MouseEvent.CLICK, obj, useCapture);
параметр obj не надо заменить на clickHandler?
Старый 25.03.2014 22:42 Psycho Tiger вне форума
Psycho Tiger
 
Аватар для Psycho Tiger
Надо.
Старый 13.03.2015 14:05 PainKiller вне форума
PainKiller
 
Аватар для PainKiller
4 способ немного расширяет вот это пример https://jadendreamer.wordpress.com/2...ent-listeners/ Наткнулся недавно, и решил сюда скинуть, дополнить))
 

 


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


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