Подтвердить что ты не робот

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

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

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

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();
}
4b9b3361

Ответ 1

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

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

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

Ответ 2

Собственно, вы можете передавать дополнительные параметры прослушивателю событий, не создавая настраиваемое событие, используя конструкцию динамических функций 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() возвращает функцию, которую мы будем вызывать, когда окно оповещения закрывается с включенными параметрами.

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 = "";
}

Ответ 3

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

Обратите внимание на полученную ошибку: в ней указано, что Function является типом и что addEventListener() хочет его. Хотя ваш слушатель возвращает пустоту, это 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));

Ответ 4

Вы можете попробовать следующее:

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

timer.addEventListener(TimerEvent.TIMER, timerHandler);

Ответ 5

Выше вызова 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/