2011-06-20 9 views
24

sql lite kullanırken aynı anda bir işlev denediğinizde ve bir hata attığından beri, sadece çalışıp çalışmadığını kontrol edecek bir işlev yapmaya çalışıyorum ve eğer 10 milisaniyede tekrar deneyin, bu tam işlev Fonksiyona herhangi bir argümanı geçmek zorunda kalmazsam iyi çalışır, ancak vars'ı tekrar icra edeceği işleve geri aktarabilirim.Esnek/actionscript'te argümanlar olay dinleyicisi işlevine nasıl geçirilir?

yapmak istiyorum:

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

Ama sadece yapmamı sağlayacaktır:

timer.addEventListener(TimerEvent.TIMER, saveChat); 

Bana bu derleme hatası verir: Ben nasıl alabilirim

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

Bu sınırlamayı geçmek için?

İşte bu var:

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

cevap

26

yalnızca onu tetikleyen bir olaydır bir argüman sahip olabilir bir dinleyici tarafından çağrılan bir fonksiyon.

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

Gerekli argümanlarla başka işlevi çağırmak olay tarafından çağrılan işleve sahip bu sorunun üstesinden gelebilirsiniz: Eğer flash.events.Event uzanan bir özel olay sınıfı oluşturmak yapabileceği başka bir şey

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

ve oluşturmak İhtiyacınız olan özellikler.

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

Ve bunun için dinlemek:

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

Sonra tanımlanan özelliklere sahip bu sevk edebilir Aslında

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

Bu deneyebilirsiniz:

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

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

, yaratmadan bir olay dinleyicisi Sizin can geçişli ek parametreler Actionscript'in dinamik işlev yapısını kullanarak özel bir olay. Uyarı penceresi için closeHandler kurarken

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

biz addArguments() yöntemini çağırın ve biz closeHandler iletmek istediğimiz tüm parametreleri continaing Bir dizide geçmektedir. AddHandler() yöntemi, Uyarı penceresi dahil edilen parametrelerle kapandığında arayacağımız işlevi döndürecektir.

saveChat çağırarak Üstü
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 çalışmaz – Kukeltje

1

(Argo, Argo, arg) benim için değil, ben bu yöntemde yok argümanları geçmesi gerekiyor ama başka bir çözüm var

Im hep ek yöntem passParameters kullanılarak

ekleyerek yeni argümanlar:

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

açıklaması burada - basit ve her zaman işe 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

Elinizdeki hatanın önemine dikkat edin: Function'un bir tür olduğunu ve addEventListener()'un bunu istemiş olduğunu belirtir. Dinleyiciniz boşa dönmesine rağmen, Function! Peki, dinleyici geri dönen hakkında ne?

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

Böyle basit. Her türlü etkinlik için çalışır. Ve kapatma sorunları yok. removeEventListener() üzerinde

Not:

timer.removeEventListener(TimerEvent.TIMER, saveChat(username, chatBoxText)) yapmaya çalışmayın. İşlevinizi tanımayacak çünkü saveChat()'u her kullandığınızda yeni bir tane geçireceksiniz. Bunun yerine, sadece bir değişkene referansını verin ve işiniz bitti:

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, bu gerçekten yararlıdır. Teşekkürler! Bu olasılığı hiç görmedim. Bunu kullanmanın bir dezavantajı var mı? Belki bir bellek sızıntısı veya böyle bir şey var mı? – OMA

+0

@OMA Bununla yıllardır iyiyim. Eğer emin olmak istiyorsanız, bir [hafıza uzmanı] ile test edin (http://stackoverflow.com/questions/1872687/actionscript-3-profiler-memory-analysis-tool). –

+0

Harika, teşekkürler. Benim durumumda, önerdiğiniz gibi bir değişkendeki işlevi referans olarak kaydetme, event.currentTarget.removeEventListener kullanıyorum (MyListener, arguments ['callee']); dinleyiciyi işlevin içinden çıkarmak için – OMA