web-dev-qa-db-ja.com

flex / actionscriptのイベントリスナー関数に引数を渡す方法は?

Sql liteを使用しているときに関数を実行しようとするとエラーがスローされるため、実行しているかどうかを確認する関数を作成しようとしているだけで、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();
}
24
brybam

リスナーによって呼び出される関数は、それをトリガーするイベントである引数を1つだけ持つことができます。

_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.
}
_
27
Marty

実際には、can Actionscriptの動的関数構成を使用してカスタムイベントを作成せずに、追加のパラメーターをイベントリスナーに渡します。

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

AlertウィンドウにcloseHandlerを設定するときは、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 = "";
}
11
Jason Towne

1067: void型の値から無関係な型の関数への暗黙の型強制

取得したエラーに十分注意してください。Functionは型であり、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));
_
10
user1837285

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
mihau

あなたはこれを試すことができます:

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

timer.addEventListener(TimerEvent.TIMER, timerHandler);
1
user700284