Как передать аргументы в функцию прослушивателя событий в 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();
}
Ответы
Ответ 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/