Comment passer des arguments dans la fonction d'écouteur d'événements dans flex/actionscript?

puisque lors de l'utilisation de sql lite si vous essayez et faites une fonction au même moment il lance une erreur, je juste essayer de faire une fonction qui vérifiera si son exécution, et si elle est essayée de nouveau dans 10 millisecondes, cette fonction exacte fonctionne très bien si je n'ai pas à passer des arguments à la fonction, mais je confonds comment je peux passer les vars de nouveau dans la fonction qu'il sera exécuté.

je veux faire:

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

Mais il ne me le permettent faire:

timer.addEventListener(TimerEvent.TIMER, saveChat);

Il me donne cette erreur de compilation:

1067: la coercition Implicite d'une valeur de type vide vers un autre type La fonction

Comment puis-je faire passer cette limite?

Voici ce que j'ai:

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
demandé sur brybam 2011-06-20 08:57:38

5 réponses

Une fonction appelée par un auditeur peut avoir qu'un seul argument, qui est le déclenchement de l'événement.

listener:Function - la fonction d'écoute qui traite l'événement. Cette fonction doit accepter un Événement objet comme seul paramètre et doit ne rien retourner, comme cet exemple affiche:

function(evt:Event):void

Source

Vous pouvez contourner ce problème en lorsque la fonction appelée par l'événement appelle une autre fonction avec les arguments requis:

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

autre chose que vous pouvez faire créer une classe d'événement personnalisée qui s'étend flash.events.Event et créer des propriétés dont vous avez besoin à l'intérieur.

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

alors vous pouvez l'envoyer avec les propriétés définies:

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

Et écouter:

addEventListener(CustomEvent.SAVE_CHAT, saveChat);
function saveChat(e:CustomEvent):void
{
    trace(e.username + ": " + e.chatBoxText);
    // Output: Marty: Custom events are easy.
}
26
répondu Marty 2012-06-26 23:08:47

en Fait, vous passez des paramètres supplémentaires à un écouteur d'événements sans créer un événement personnalisé en utilisant la construction de la fonction dynamique D'Actionscript.

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

lors de la configuration du closeHandler pour la fenêtre D'Alerte, nous appelons la méthode addArguments() et passons dans un tableau en continuant tous les paramètres que nous voulons passer au closeHandler. La méthode addHandler() retournera la fonction que nous appellerons lorsque la fenêtre D'alerte se ferme avec les paramètres inclus.

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 = "";
}
12
répondu Jason Towne 2016-06-09 18:45:42

1067: coercition implicite d'une valeur de type vide à une fonction de type sans rapport

faites bien attention à l'erreur que vous avez: Elle dit que a Function est un type et que addEventListener() le veut. Bien que votre auditeur retourne void, c'est un Function! Donc, concernant le retour l'auditeur?

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!
  };
}

Simple comme ceci. Il fonctionne pour tout type d'événement. Et pas de fermeture question.

Remarque:removeEventListener():

ne pas essayer de faire timer.removeEventListener(TimerEvent.TIMER, saveChat(username, chatBoxText)). Il ne reconnaîtra pas votre fonction parce que vous passerez un nouveau sur elle à chaque fois que vous utilisez saveChat(). Au lieu de cela, il suffit de prendre sa référence dans une variable et vous avez terminé:

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));
11
répondu 2012-12-16 13:11:23

Vous pouvez essayer ceci:

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

timer.addEventListener(TimerEvent.TIMER, timerHandler);
1
répondu user700284 2011-06-20 05:15:56

appel à saveChat(arg, arg, arg) ce n'est pas pour moi, je dois passer des arguments que je n'ai pas dans cette méthode mais j'ai une autre solution

J'utilise toujours des passparamètres de méthode supplémentaires pour ajouter de nouveaux arguments:

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

explication de ceci est ici-son travail simple et toujours http://sinfinity.pl/blog/2012/03/28/adding-parameters-to-event-listener-in-flex-air-as3/

1
répondu mihau 2012-03-28 20:31:40