Flash, ActionScript 3: Как вы даете EventListener функцию с параметрами?
Я пытаюсь прикрепить функцию с параметрами к таймеру, но он говорит "несвязанная функция типа" есть ли способ обойти это??
Пример кода:
var redoTimer:Timer = new Timer(50);
redoTimer.addEventListener(TimerEvent.TIMER, saySomething("helloo"));
redoTimer.start();
Это, кажется, не работает, но есть ли способ передать аргументы???
Спасибо Matthy
4 ответа:
На самом деле вы не можете этого сделать, ближайший эквивалент будет использовать небольшую встроенную функцию для обертывания вашей собственной функции:
var redoTimer:Timer = new Timer(50); redoTimer.addEventListener(TimerEvent.TIMER, function(e:Event):void { saySomething("helloo") } ); redoTimer.start();
Второй параметрфункции
Кроме того, функция прослушивателя событий должна принимать один и только один аргумент типаaddEventListener
должен быть функцией. Ваш код фактически выполняет методsaySomething("helloo")
и пытается использовать его возвращаемое значение в качестве второго параметра дляaddEventListener
и, следовательно, ошибки.flash.events.Event
. Они могут иметь необязательные аргументы со значениями по умолчанию, если вы хотите вызвать их явно из вашего кода.
Это возможно при обходном подходе. Для обработчика событий используйте функцию , которая возвращает вложенную анонимную функцию.
private var textFieldA:TextField = new TextField; private var textFieldB:TextField = new TextField; public function setParameterizedTextWhenTextFieldsAreClicked ():void { addChild(textFieldA); textFieldA.text = 'Text field A'; textFieldA.addEventListener(MouseEvent.CLICK, showCustomMessage("One")); addChild(textFieldB); textFieldB.text = 'Text field B'; textFieldB.y = 20; textFieldB.addEventListener(MouseEvent.CLICK, showCustomMessage("Two")); // NOTE: We must use strongly referenced listeners because weakly referenced // listeners **will get garbage collected** because we're returning // an anonymous function, which gets defined in the global namespace and // thus, the garbage collector does not have anything pointing to it. } private function showCustomMessage (message:String):Function { // NOTE: You can store the following function to a class variable // to keep it in memory, which would let you use weakly referenced // listeners when using this as an event handler. Many people // would find that awkward. I would discourage that. return function (e:MouseEvent):void { var textField:TextField = e.target as TextField; textField.text = message; // "message" argument is available because // this function's scope is kept in memory. } }
Имейте в виду, что использование анонимных функций и опора на область действия функции, хранящуюся в памяти, по-видимому, представляют сложности при сборке мусора.
Из коробки: требуется всего 2 дополнительных строки элегантного кода, чтобы решить эту древнюю головоломку.
stage.addEventListener(MouseEvent.CLICK, onClick(true, 123, 4.56, "string")); function onClick(b:Boolean, i:int, n:Number, s:String):Function { return function(e:MouseEvent):void { trace("Received " + b + ", " + i + ", " + n + " and " + s + "."); }; }