关于事件传值的诡异错误

Apr 28, 2012

Flex4Parsley 写一个传递 DataGrid 被点击对象的事件分发与接收,DataGrid 是用 Index 类型构成的数组为数据源,因此将被点击事件的对象用as关键字转换为Index,用名为IndexGridMessage为载体的消息对象封装后,向全局dispatcher该对象(可以理解成分发事件)。需求是不难,一开始是这么写的:

public function selectedIndex(event:GridEvent):void{
    dispatcher(new IndexGridMessage(event.item as Index));
}

此时,接收对象始终无法捕获到分发的对象,经过调试,分发代码写成如下情况可以被捕获:

public function selectedIndex(event:GridEvent):void{
    var index:Index = event.item as Index;
    dispatcher(new IndexGridMessage(index));
}

仔细想想,两种写法的对象生命周期应该是完全相同的,都没有采用 new 的方式生成新对象。 但正确的写法中,Message 传递了分发事件的引用对象,猜想失效的原因有如下两种可能:

  • var声明对象后,经过 as 转换的对象是生成的新对象,底层机制和 new 相同;
  • 经过var命名的对象有了自己的引用名称(可以看做声明了该对象的指针),因此被传递可以找到原对象的地址。

结果还需要进一步验证,当然这次用 Parsley 框架可是略显不完整,接下来的任务是用 Event 方式重构问题, 深入了解运行机制。