2011-03-16 101 views
0

我發送一個事件時,一個SQL查詢返回沒有匹配,這樣我就可以繼續添加到數據庫..看起來像動作要求我附加偵聽器的東西,但我真的沒有任何變量在我的代碼中,這似乎是合乎邏輯的候選人。在偵聽自定義事件時,要添加EventListener的內容?

我只是想偵聽isNewRecord事件被調用,以便我可以運行插入查詢;現在它說是調用addEventListern和dispatchEvent可能未定義的方法

public function addBG(BG:Number, datetime:String, batch:Boolean = false):void{ 
     checkRecord('Gb', datetime, matchRecord); 

     addEventListener("isNewRecord", recordExists); 

     function recordExists() 
     {/*code to execute query*/} 

public function matchRecord(result:SQLResult):void { 
     var match:String = result.data[0]; 
     if (match == null) { 
      var allClear:Event = new Event("isNewRecord"); 
      dispatchEvent(allClear); 
     } 
    } 

回答

1

您的代碼是越野車。你在一個函數中有一個函數。

此外,您的代碼是否擴展EventDispatcher類(或者擴展它的任何類,如Sprite,MovieClip等?)確保它是。

試試這個:

public function addBG(BG:Number, datetime:String, batch:Boolean = false):void 
{ 
     // note, you're adding this event listener EVERY TIME you call the 
     // addBG function, so make sure you remove it OR add it somewhere in the 
     // init or complete functions 

     addEventListener("isNewRecord", recordExists); 
     checkRecord('Gb', datetime, matchRecord);  
} 
public function recordExists():void 
{/*code to execute query*/} 

public function matchRecord(result:SQLResult):void { 
     var match:String = result.data[0]; 
     if (match == null) { 
      var allClear:Event = new Event("isNewRecord"); 
      dispatchEvent(allClear); 
     } 
} 
+0

我的問題是,我試圖做一種數據庫模型,每種類型數據的「添加」功能;但我需要驗證它不在那裏,這需要超出該函數w/sqlresult ..我認爲最好不要做所有的參數類屬性。也許這就是我必須要做的......不,它不會擴展事件調度程序,因爲這在語義上沒有意義,但我想這就是爲什麼添加/調度事件不起作用?儘管相同的代碼直接在mxml文件中工作。 – Damon 2011-03-16 03:45:30

+1

是的,你需要有一個EventDispatcher對象,或者讓這個類擴展EventDispatcher以便使用addEventListener/dispatchEvent方法...所以在語義上它是有意義的。你應該把「addEventListener」方法放在「checkRecord」之上。這是我的不好,我編輯了我的代碼。對於Model對象來說,檢查數據庫並引發Exception或某種邏輯來處理已經存在的結果是很好的。 – 2011-03-16 14:32:52

0

你並不需要使用事件。您對SQLResult的處理似乎是同步的,由於與用戶,服務器或任何可能需要一些時間的任何交互而沒有延遲。

當Flash執行你的代碼確實如下因素:添加監聽器之前

checkRecord('Gb', datetime, matchRecord); 
//then 
var match:String = result.data[0]; 
if (match == null) { 
    var allClear:Event = new Event("isNewRecord"); 
    dispatchEvent(allClear); 
} 
//and finally 
addEventListener("isNewRecord", recordExists); 

分派事件。 這裏是你應該做的:

public function addBG(BG:Number, datetime:String, batch:Boolean = false):void 
{ 
     if (checkRecord('Gb', datetime, matchRecord)) 
     { 
      recordExists(); 
     } 
} 

public function recordExists():void 
{/*code to execute query*/} 

public function matchRecord(result:SQLResult):Boolean{ 
     var match:String = result.data[0]; 
     if (match == null) { 
      return true; 
     } 
     return false; 
} 

乾杯

+0

問題是,matchRecord被稱爲SQLResult事件或callbakcListener函數。我試圖返回一個布爾值,但由於這些函數是從監聽器調用的,所以我沒有看到如何從中獲取返回值。與事件監聽者的問題部分解釋了爲什麼它不工作,不能相信我錯過了! – Damon 2011-03-16 14:47:25

相關問題