Flash, ActionScript 3: как дать функции EventListener с параметрами? - PullRequest
2 голосов
/ 27 июня 2010

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

пример кода:

var redoTimer:Timer = new Timer(50);

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

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

спасибо Матти

Ответы [ 4 ]

3 голосов
/ 28 июня 2010

Второй параметр от до функции addEventListener должен быть функцией. Ваш код фактически выполняет метод saySomething("helloo") и пытается использовать его возвращаемое значение в качестве второго параметра addEventListener и, следовательно, ошибку.

Кроме того, функция прослушивателя событий должна принимать один и только один аргумент типа flash.events.Event. Они могут иметь необязательные аргументы со значениями по умолчанию, если вы хотите явно вызывать их из своего кода.

3 голосов
/ 27 июня 2010

Вы действительно не можете этого сделать, ближайший эквивалент будет использовать небольшую встроенную функцию, чтобы обернуть вашу собственную функцию:

var redoTimer:Timer = new Timer(50);

redoTimer.addEventListener(TimerEvent.TIMER, function(e:Event):void { saySomething("helloo") } );
redoTimer.start();
0 голосов
/ 07 февраля 2014

Из коробки: для решения этой древней головоломки требуется всего лишь 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 + ".");
  };
}
0 голосов
/ 16 ноября 2013

Это возможно при обходном подходе. Для обработчика событий используйте функцию , которая возвращает вложенную анонимную функцию .

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.
    }
}

Имейте в виду, что использование анонимных функций и зависимость от объема функций, сохраняемых в памяти, представляют сложности для сборки мусора.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...