Как передать аргументы в функцию прослушивателя событий в flex / actionscript? - PullRequest
24 голосов
/ 20 июня 2011

Так как при использовании sql lite, если вы попытаетесь выполнить функцию в одно и то же время, она выдаст ошибку, я просто пытаюсь создать функцию, которая проверит, выполняется ли она, и если она будет повторена через 10 миллисекунд, это точноФункция работает нормально, если мне не нужно передавать какие-либо аргументы функции, но я запутался, как я могу передать переменные обратно в функцию, которую она будет выполнять.

Я хочу сделать:

timer.addEventListener(TimerEvent.TIMER, saveChat(username, chatBoxText));

Но это только позволит мне сделать:

timer.addEventListener(TimerEvent.TIMER, saveChat);

Это дает мне эту ошибку компиляции:

1067: Неявное приведение значениятипа void к несвязанному типу Функция

Как я могу получить это, чтобы пройти это ограничение?

Вот что у меня есть:

public function saveChat(username:String, chatBoxText:String, e:TimerEvent=null):void
{
    var timer:Timer = new Timer(10, 1);
    timer.addEventListener(TimerEvent.TIMER, saveChat);

    if(!saveChatSql.executing)
    {
        saveChatSql.text = "UPDATE active_chats SET convo = '"+chatBoxText+"' WHERE username = '"+username+"';";
        saveChatSql.execute();
    }
    else timer.start();
}

Ответы [ 5 ]

26 голосов
/ 20 июня 2011

Функция, вызываемая слушателем, может иметь только один аргумент, который является событием, инициирующим ее.

listener:Function - Функция слушателя, которая обрабатывает событие.Эта функция должна принимать объект Event как единственный параметр и не должна возвращать ничего, как показано в следующем примере:

function(evt:Event):void

Источник

Эту проблему можно обойти, вызвав функцию, вызванную событием, вызовом другой функции с необходимыми аргументами:

timer.addEventListener(TimerEvent.TIMER, _saveChat);
function _saveChat(e:TimerEvent):void
{
    saveChat(arg, arg, arg);
}

function saveChat(arg1:type, arg2:type, arg3:type):void
{
    // Your logic.
}

Еще одна вещь, которую вы можете сделать, создать собственный класс событий, который расширяет flash.events.Event и создать нужные вам свойства.

package
{
    import flash.events.Event;

    public class CustomEvent extends Event
    {
        // Your custom event 'types'.
        public static const SAVE_CHAT:String = "saveChat";

        // Your custom properties.
        public var username:String;
        public var chatBoxText:String;

        // Constructor.
        public function CustomEvent(type:String, bubbles:Boolean=false, cancelable:Boolean=false):void
        {
            super(type, bubbles, cancelable);
        }
    }
}

Затем вы можете отправить это с определенными свойствами:

timer.addEventListener(TimerEvent.TIMER, _saveChat);
function _saveChat(e:TimerEvent):void
{
    var evt:CustomEvent = new CustomEvent(CustomEvent.SAVE_CHAT);

    evt.username = "Marty";
    evt.chatBoxText = "Custom events are easy.";

    dispatchEvent(evt);
}

И послушай это:

addEventListener(CustomEvent.SAVE_CHAT, saveChat);
function saveChat(e:CustomEvent):void
{
    trace(e.username + ": " + e.chatBoxText);
    // Output: Marty: Custom events are easy.
}
11 голосов
/ 01 июля 2011

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

private function addArguments(method:Function, additionalArguments:Array):Function
{
  return function(event:Event):void {method.apply(null, [event].concat(additionalArguments));}
}

При настройке closeHandler для окна Alert мы вызываем метод addArguments () и передаем массив, содержащий все параметры, которые мы хотим передать в closeHandler.Метод addHandler () вернет функцию, которую мы вызовем при закрытии окна Alert с включенными параметрами.

protected function btnOK_clickHandler(event:MouseEvent):void
{
  Alert.show("Would you like to reverse the text you just entered?", "", Alert.YES | Alert.NO, null, addArguments(alertCloseHandler, [txtInput.text]), null, Alert.YES);
  txtInput.text = "";
}
10 голосов
/ 16 декабря 2012

1067: Неявное приведение значения типа void к несвязанному типу Функция

Обратите внимание на полученную ошибку: она говорит, что1007 * - это тип, который addEventListener() хочет.Хотя ваш слушатель возвращает void, это Function!Итак, как насчет возврата слушателя ?

timer.addEventListener(TimerEvent.TIMER, saveChat(username, chatBoxText));
function saveChat(username:String, chatBoxText:String):Function {
  return function(e:TimerEvent):void {
    // Do everything that uses "e", "chatBoxText" and "username" here!
  };
}

Просто так.Это работает для любого вида событий. И никаких проблем с закрытием.

Примечание по removeEventListener():

Не пытайтесь сделать timer.removeEventListener(TimerEvent.TIMER, saveChat(username, chatBoxText)).Он не распознает вашу функцию, потому что вы будете передавать новую функцию каждый раз, когда вы используете saveChat().Вместо этого просто извлеките ее ссылку в переменную, и все готово:

var functionSaveChat:Function = saveChat(username, chatBoxText);
timer.addEventListener(TimerEvent.TIMER, functionSaveChat);
//trace(timer.hasEventListener(TimerEvent.TIMER));
timer.removeEventListener(TimerEvent.TIMER, functionSaveChat);
//trace(timer.hasEventListener(TimerEvent.TIMER));
1 голос
/ 29 марта 2012

Над вызовом saveChat (arg, arg, arg) это не для меня, мне нужно передать аргументы, которых у меня нет в этом методе, но у меня есть другое решение

Я всегда использую дополнительный метод passParameters для добавления новых аргументов:

public function passParameters(method:Function,additionalArguments:Array):Function
{return function(event:Event):void{
    method.apply(null, [event].concat(additionalArguments));}
}

Объяснение этого здесь - это просто и всегда работает http://sinfinity.pl/blog/2012/03/28/adding-parameters-to-event-listener-in-flex-air-as3/

1 голос
/ 20 июня 2011

Вы можете попробовать это:

var timerHandler:Function = function (event:TimerEvent):void
{
   saveChat(username,chatBoxText,event);
}

timer.addEventListener(TimerEvent.TIMER, timerHandler);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...