2011-06-20 36 views
24

Ponieważ przy użyciu sql lite, jeśli spróbujesz wykonać funkcję w tym samym momencie, zgłasza błąd, próbuję tylko wykonać funkcję, która sprawdzi, czy jest ona wykonywana, a jeśli spróbuję ponownie za 10 milisekund, ta dokładna funkcja działa dobrze, jeśli nie muszę przekazywać żadnych argumentów do funkcji, ale jestem zdezorientowany, jak mogę przekazać vars z powrotem do funkcji, która będzie wykonywana.Jak przekazywać argumenty do funkcji detektora zdarzeń w flex/actionscript?

chcę zrobić:

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

Ale to tylko pozwala mi robić:

timer.addEventListener(TimerEvent.TIMER, saveChat); 

To daje mi ten błąd kompilacji:

1067: Implicit coercion of a value of type void to an unrelated type Function

Jak mogę dostać to, aby przejść to ograniczenie?

Oto co mam:

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

Odpowiedz

26

Funkcja wywoływana przez słuchacza może mieć tylko jeden argument, który jest zdarzenie wyzwalania.

listener:Function — The listener function that processes the event. This function must accept an Event object as its only parameter and must return nothing, as this example shows:

function(evt:Event):void

Source

Można obejść ten problem poprzez funkcję zwaną przez zdarzenie wywołać inną funkcję z wymaganymi argumentami:

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

Inną rzeczą, jaką możesz zrobić utworzyć klasę zdarzenia niestandardowego, który rozciąga flash.events.Event i tworzyć właściwości, których potrzebujesz w ciągu.

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

Następnie można wysyłką to z właściwości zdefiniowane:

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

i słuchać go:

addEventListener(CustomEvent.SAVE_CHAT, saveChat); 
function saveChat(e:CustomEvent):void 
{ 
    trace(e.username + ": " + e.chatBoxText); 
    // Output: Marty: Custom events are easy. 
} 
1

Można spróbować to:

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

timer.addEventListener(TimerEvent.TIMER, timerHandler); 
12

Właściwie może podać dodatkowe parametry detektora zdarzeń bez tworzenia zdarzenie niestandardowe za pomocą konstrukcji dynamicznej funkcji Actionscript.

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

Podczas konfigurowania closeHandler dla okna Alert nazywamy addArguments() metody i przechodzą w tablicy continaing wszystkie parametry, które chcemy przekazać do closeHandler. Metoda addHandler() zwróci funkcję, którą wywołamy, gdy okno Alert zostanie zamknięte z uwzględnieniem parametrów.

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

Link nie działa – Kukeltje

1

Przede nazywając saveChat (Arg, Arg, Arg) to nie dla mnie, muszę przekazywać argumenty, że nie mam w tej metodzie, ale mam inne rozwiązanie

Im zawsze stosowania dodatkowych passParameters metoda dodawanie nowych argumentów:

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

wyjaśnienie tego jest tutaj - jego prosty i zawsze działa http://sinfinity.pl/blog/2012/03/28/adding-parameters-to-event-listener-in-flex-air-as3/

11

1067: Implicit coercion of a value of type void to an unrelated type Function

Zwróć szczególną uwagę na otrzymany błąd: mówi, że Function jest typem i że chce tego addEventListener(). Chociaż Twój słuchacz zwraca nieważne, jest to Function! A co powiesz na powrót słuchacza słuchacza?

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

Takie proste. Działa na każde wydarzenie. I żadnych problemów z zamknięciem.

Uwaga na removeEventListener():

Nie próbuj robić timer.removeEventListener(TimerEvent.TIMER, saveChat(username, chatBoxText)). Nie rozpoznaje on Twojej funkcji, ponieważ za każdym razem, gdy używasz saveChat(), będziesz przekazywać nową. Zamiast tego, po prostu przenieś jego referencję do zmiennej i gotowe:

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

Wow, to jest naprawdę pomocne. Dzięki! Nigdy nie widziałem tej możliwości komentowania. Czy jest jakiś minus tego używania? Może jest jakiś wyciek pamięci czy coś takiego? – OMA

+0

@OMA Byłem w porządku przez lata z tym. Jeśli chcesz się upewnić, przetestuj go za pomocą [profilera pamięci] (http://stackoverflow.com/questions/1872687/actionscript-3-profiler-memory-analysis-tool). –

+0

Świetnie, dziękuję. W moim przypadku, instaed zapisu odniesienia do funkcji w zmiennej, jak zasugerowałeś, używam event.currentTarget.removeEventListener (MyListener, argumenty ['callee']); aby usunąć słuchacza z wnętrza funkcji. – OMA

Powiązane problemy