2011-03-16 105 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

相关问题