如何在flex / actionscript中将参数传递给事件监听器函数?

时间:2011-06-20 04:57:39

标签: actionscript-3 flash flex events arguments

因为当你使用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 个答案:

答案 0 :(得分:26)

侦听器调用的函数只能有一个参数,即触发它的事件。

  

listener:Function - 处理事件的侦听器函数。   此功能必须接受事件   object作为唯一的参数而且必须   什么都不返回,就像这个例子   示出了:

     

function(evt:Event):void

     

Source

你可以通过让事件调用的函数调用另一个带有所需参数的函数来解决这个问题:

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

答案 1 :(得分:12)

实际上,可以将其他参数传递给事件侦听器,而无需使用Actionscript的动态函数构造创建自定义事件。

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

当为Alert窗口设置closeHandler时,我们调用addArguments()方法并传入一个数组,该数组包含我们想要传递给closeHandler的所有参数。当Alert窗口关闭并包含参数时,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 = "";
}

答案 2 :(得分:11)

  

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));

答案 3 :(得分:1)

你可以试试这个:

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

timer.addEventListener(TimerEvent.TIMER, timerHandler);

答案 4 :(得分:1)

上面调用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/