PDA

Просмотр полной версии : Передача параметров в listener


MaxD
27.04.2007, 15:58
Есть элемент, к которому добавлен listener.
img0.addEventListener(MouseEvent.CLICK,addItem);
Есть, соответственно функция addItem

private function addItem(e:Event):void{
...
}
Мне нужно в эту функцию еще передавать параметр, то есть
private function addItem(e:Event, str:String):void{
...
}
Следовательно, привязка listener должна происходить как-то так:
img0.addEventListener(MouseEvent.CLICK,addItem(event,myString));
Но ActionScript думает по-другому и выдает такое:
"Implicit coercion of a value of type void to an unrelated type function"

Как передать параметр?

lowka
27.04.2007, 16:08
Можно написать класс, который будет наследоваться от Event, и в нем передавать нужные параметры.

MaxD
27.04.2007, 16:15
А проще?

etc
27.04.2007, 16:26
Куда уж проще?

miramax
27.04.2007, 16:33
Ну есть готовый класс DataEvent....

MaxD
27.04.2007, 16:35
Куда уж проще?
Создать целый лишний класс чтобы один раз передать параметр?

etc
27.04.2007, 16:41
А что, жалко что-ли? Да хоть сотня.
Добавить несколько строк кода всего-лишь. Просто в новом файле и все.
Странные люди…

7thsky™
27.04.2007, 17:26
Как вариант, анонимная функция (специально для ленивцев)


private function creationCompleteHandler (event:FlexEvent):void {
var testString:String = 'walla';
addEventListener (
MouseEvent.MOUSE_MOVE,
function (evt:MouseEvent):void {
moveItem (evt, 'test', testString);
});
}

private function moveItem (evt:MouseEvent, test:String, ... args):void {
trace (test, args);
}

etc
27.04.2007, 17:36
Во изврат-то…

7thsky™
27.04.2007, 17:38
Денис, этож динамика :) Тут некоторые любители продвинутых динамических языков прям молются на клошуры (MethodClosure), а у нас они на халяву с 5 флэша :)

Timerlan
28.04.2007, 00:28
Можно написать класс, который будет наследоваться от Event, и в нем передавать нужные параметры.

а можно пример, как это сделать, если не сложно?

etc
28.04.2007, 00:30
Представление о том, как наследуются классы, имеется?

Timerlan
28.04.2007, 00:32
да, но не могу сообразить что в этом классе написать и непонятно, что должно прийти к функции вместо e:Event. По идее это будет объект события моего созданного класа, т.е. не e:Event, а e:MyClass

etc
28.04.2007, 00:37
package {
import flash.events.Event;
public class MyEvent {
public var anyVariable:Number = null;
public function MyEvent(type:String, bubbles:Boolean = false, cancelable:Boolean = false) {
super(type, bubbles, cancelable);
}
}
}

var event:MyEvent = new MyEvent(Event.MOUSE_DOWN);
event.myVariable = 20;
dispatchEvent(event);
Как-то так. Писал спьяну и на коленке, мог и накосячить где…

Timerlan
28.04.2007, 00:57
спасибо

etc
28.04.2007, 01:00
Второй код — просто пример, как диспетчить событие типа MOUSE_DOWN с параметром, не более того.

AlexMac
29.04.2007, 20:42
А зачем тебе передавать параметры в функцию? Если она у тебя содержится в классе она и так имеет доступ ко всем переменным этого класса.

то есть если у нас к примеру есть такой класс:

package {import flash.display.Sprite;
import flash.net.URLLoader;
import flash.net.URLRequest;
import flash.events.HTTPStatusEvent;

public class HTTPStatusEventExample extends Sprite {
// объявим переменную в классе
var url:string ="http://www.[yourDomain].com/MissingFile.html"

public function HTTPStatusEventExample() {

var loader:URLLoader = new URLLoader();
loader.addEventListener(HttpStatusEvent.HTTP_STATUS, httpStatusHandler);
var request:URLRequest = new URLRequest(url);
loader.load(request);
}

private function httpStatusHandler(event:HTTPStatusEvent):void {
if (event.status==404) {
// переменная url объявленная в классе доступна и в функциях и в вспомагательных классах
trace("Ошибка: " + event.status);
trace("невозможно соединится с " + url);
} } }}

при запуске он даст следующее, при отсутствии данной странице на сервере:

Ошибка: 404
Невозможно соединится с http://www.[yourDomain].com/MissingFile.html

etc
29.04.2007, 20:51
Речь идет о кастомных событиях и кастомных классах.