flex事件模型

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。

你可能感兴趣的:(事件,Flex,event,currentTarget,dispatchEvent)