一、 事件的优先权
你可以为一个事件注册多个事件监听器。Flex按照通过addEventListener()方法注册监听器的顺序调。不过,如果你注册了一些行内的监听器,又通过addEventLisntener()方法添加了一些监听器,事件监听器的调用顺序将不可预知。
你可以通过使用addEventListener()方法的priority参数来改变事件监听器的调用顺序。
Flex按照priority参数从高到低的顺序调用监听器。优先级最高的第一个调用。下面的例子中,FlexsaveInputDate()函数前调用verifyInputData()方法,最后一个调用的是returnResult()方法。
<?xml version="1.0"?>
<!-- events/ShowEventPriorities.mxml -->
<mx:Application xmlns:mx="http://www.adobe.com/2006/mxml" creationComplete="initApp()">
<mx:Script><![CDATA[
private function returnResult(e:Event):void {
ta1.text += "returnResult() method called last (priority 1)\n";
}
private function verifyInputData(e:Event):void {
ta1.text += "verifyInputData() method called first (priority 3)\n";
}
private function saveInputData(e:Event):void {
ta1.text += "saveInputData() method called second (priority 2)\n";
}
private function initApp():void {
b1.addEventListener(MouseEvent.CLICK, returnResult, false, 1);
b1.addEventListener(MouseEvent.CLICK, saveInputData, false, 2);
b1.addEventListener(MouseEvent.CLICK, verifyInputData, false, 3);
}
]]></mx:Script>
<mx:Button id="b1" label="Click Me"/>
<mx:TextArea id="ta1" height="200" width="300"/>
</mx:Application>
你可以将优先级设定为任何有效的整数,可以使正数也可以是负数。如果多个监听器拥有相同的优先级,那么它们将按照注册的顺序被调用。
一旦事件监听器被定义,如果你再想改变监听器的优先级,就必须首先调用removeEventListener()方法移除监听器,然后再使用新的优先级添加监听器。
addEventListener()方法的priority参数并不是官方的DOM Level 3事件模型的一部分。
即使你为一个事件监听器设定了一比其他监听器都要高的优先级,也不能保证这个监听器一定会在其他监听器之前被调用。你必须确定在下一个监听器被调用之前,监听器不依赖于其他监听器的完整的执行。了解这一点非常重要,Flash Player没有必要在调用下一个监听器之前等待前一个监听器完成处理。
如果你的监听器依赖于其他的监听器,你可以在一个监听器中调用其它的监听器,或者在第一个事件监听器中调度一个新的事件。
二、 使用事件子类
依赖与事件类型,Event对象可以拥有一个范围很大的属性集合。这些属性都基于W3C的说明而定义,但是Flex并没有提供全部的实现。
当你在事件监听器函数中定义一个Event对象时,你可以将它定义为Event类型,或者你可以指定一个Event对象的子类。下面的例子中,你指定事件对象的类型为MouseEvent:
public function performAction(e:MouseEvent):void {
...
}
多数控件都会生成一个特殊的事件类型。指定一个更加特殊的事件类型,你就可以访问特殊的属性,而不需要进行类型转换。此外,一些Event对象的子类型还提供了基础的Event类型所没有的方法。
一个在运行时定义的事件对象可以是编译期类型的一个子类。即使你没有定义特殊的事件类型,只要你将Event对象转换为一个特殊的类型,你仍然可以在事件监听器中访问那些事件的特殊属性。在下面的例子中,函数将对象类型定义为Event。不过,在函数中,必须先将Event对象转换为MouseEvent理性,你才能访问localXlocalY属性:
<!-- events/AccessEventSpecificProperties.mxml -->
<mx:Application xmlns:mx="http://www.adobe.com/2006/mxml" initialize="addListeners()">
<mx:Script><![CDATA[
import mx.controls.Alert;
private function customLogEvent(e:Event):void {
var a:MouseEvent = MouseEvent(e);
Alert.show("Y: " + a.localY + "\n" + "X: " + a.localX);
}
private function addListeners():void {
b1.addEventListener(MouseEvent.CLICK, customLogEvent);
}
]]></mx:Script>
<mx:Button id="b1" label="Click Me"/>
</mx:Application>
如果你将Event对象定义为一个特殊的类型,你就不需要在函数中进行类型转换。如下所示:
private function customLogEvent(e:MouseEvent):void { ... }
在前面的例子中,你也可以只在访问属性时使用下面例子中的语法转换Event对象:
<!-- events/SinglePropertyAccess.mxml -->
<mx:Application xmlns:mx="http://www.adobe.com/2006/mxml" initialize="addListeners()">
<mx:Script><![CDATA[
import mx.controls.Alert;
private function customLogEvent(e:Event):void {
Alert.show("Y: " + MouseEvent(e).localY + "\n" + "X: " + MouseEvent(e).localX);
}
private function addListeners():void {
b1.addEventListener(MouseEvent.CLICK, customLogEvent);
}
]]></mx:Script>
<mx:Button id="b1" label="Click Me"/>
</mx:Application>
这样做虽然将使用更少的内存和系统资源,但是最好还是尽可能的将事件类型定义为特殊的类型。
每个Event对象的子类都提供该类型所独有的额外的属性和事件类型。MouseEvent类定义了与输入设备有关的几种事件,包括CLICK,DOUBLE_CLLICK,MOUSE_DOWNMOUSE_UP事件类型。

本文出自 “Flex RIA” 博客,请务必保留此出处http://flexria.blog.51cto.com/753638/154541

posted on 2012-02-07 10:54  星^_^風  阅读(295)  评论(0编辑  收藏  举报