Flash, ActionScript 3: Как вы даете EventListener функцию с параметрами?


Я пытаюсь прикрепить функцию с параметрами к таймеру, но он говорит "несвязанная функция типа" есть ли способ обойти это??

Пример кода:

var redoTimer:Timer = new Timer(50);

redoTimer.addEventListener(TimerEvent.TIMER, saySomething("helloo"));
redoTimer.start();

Это, кажется, не работает, но есть ли способ передать аргументы???

Спасибо Matthy

4 2

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 + ".");
  };
}