flex事件模型

[size=medium]EventDispatcher and IEventDispatcher是Flex提供给我们事件机制的模型,所有的displayObject都继承了EventDispatcher,因此可以直接在这些对象上调用addEventListener()方法,对于自定义的对象,如果想使用事件机制,就必选继承EventDispather或者定义一个EventDispatcher的成员变量。另外请注意,事件有capture phase, target phase ,bubble phase,如果你想在capture phase使用事件,也即在event的dispatcher的ancestor中注册listener,必须是该event是ancestor支持的event.

参考:You can only register an event listener with an object if that object dispatches the event. For example, you cannot register a Form container to listen for a click event, even though that container contains a Button control. Form containers do not dispatch click events. Form containers do dispatch the mouseDown event, so you could put a mouseDown event listener on the Form container tag. If you do that, your event listener is triggered whenever the Button control or Form container receives a mouseDown event.
Target 是dispatchEvent的对象,它是始终不变的,

currentTarget是event flow中当前在examine listener的对象,在不同的eventPhase是变化的。

虽然只有displayObject会被flashPlayer或AIR自动propagation, 对与自定义的对象我们可以手动传播,这样可以将一个自定义对象内的事件传播到其他的对象(任何对象,包括父容器)中取,由其他对象来处理。
当在自定义类中使用了[Event(name="afterDelete", type="flash.events.Event")]后,自定义类中就可以直接调用dispatchEvent(),addEventListener()而不需要再new 一个EventDispatcher做成员变量,然后通过成员变量来实现propagate event 的功能。
另外注意在自定义的propagate过程中,已经triggered的event类型可能会被强制转换成通过[Event(name="afterDelete", type="flash.events.Event")]语句声明的event类型,
例如,如果元标记用的是[Event(name="afterDelete", type="flash.events.Event")],而派发的事件为dispatchEvent(new DataModelEvent("afterUpdate"));

那么在注册listener是应该如下:addEventListener(“afterUpdate”,propagateEvent);

public function propagateModelEvent(e:Event):void
{
dispatchEvent(e);
}

注意参数用的是e:Evnet,不应该用CustomEvent,否则可能报错,因为原标记中event类型为Event,而不是CustomEvent。
[/size]
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值