Delegate(委派)类是一个非常有用的类,由 Mike Chambers 编写,它可以使组件的事件应用更容易,这个类已经包含在”Ellipsis”中,也就是 flashmx2004 的升级版本中,在开始之前请先去下载升级版本flashmx2004updata_cn.exe, 升级版本中包含有 Delegate 类,它使 FLASH 更加稳定,快速,更好。
通常情况下,你可能用两种方式来指定组件的事件类型,一种是使用 addEventListener:指定事件给一个对象,一种是指事件定给一个函数。
指定事件给对象:
我们可以这样
代码: |
var obj = new Object(); obj.click = function(evt) { trace(evt.target); trace(this); } myBtn.addEventListener("click",obj); |
指定事件给函数:
代码: |
function myClickHander(evt){ trace(evt.target); trace(this); } myBtn.addEventListener("click",myClickHander); |
第一种方法的问题在于事件方法必须与事件同名(也说是上例中的 click)。因此,如果你想指定几个组件事件给一同一个对象,你需要创建很笨而且冗长的条件语句。象这样:
代码: |
obj = new Object(); obj.click = function(evt) { if(evt.target == ‘myBtn’) { trace(‘first button’); } if(evt.target == ‘myBtn2’) { trace(‘second button’); } } myBtn.addEventListener("click",obj); myBtn2.addEventListener("click",obj); |
第二种方法的问题在于范围:“this”引用触发事件的组件,不管你的函数在哪里定义。因些如果你想指定几个事件给同一个函数,”this”所指的对象会在函数每次执行时都不同。与上面的情况非常相似,我们仍需要大量的条件语句。
Mike Chambers 针对多个对象和不太好的范围问题提供了一流的解决方法,也就是 Delegate 类。不需要直接设计侦听器,你可以指定一个 delegate 定义来侦听事件,它会在正确的范围内调用真实的方法。下面展示通过一个按钮说时你如何来使用它。
代码: |
import mx.utils.Delegate; function myClickHandler(evt) { trace(evt.target); trace(this); } myBtn.addEventListener("click", Delegate.create(this,myClickHandler)); |
注意:我们需要先导入 delegate 类,位于 mx.utils.Delegate,当需要指定事件句柄时,我们创建一个 Delegate,指定范围和最终的事件句柄。Delegate 类只是声明一个静态的对象,create, 类似如下创建过程:
代码: |
static function create(obj:Object, func:Function):Function |
上面的代码中的 obj 是你想要指定给 func 函数的范围。如果你想要移除事件侦听,也是非常简单:如下:
代码: |
import mx.utils.Delegate; var md = Delegate.create(this, someFunction); myBtn.addEventListener(‘click’,md); // 其它动作 // 然后移除 myBtn.removeEventListener(‘click’,md); |
如你所看到的,Delegate.create 给你一个非常好和简单的方法来处理组件的事件。引用 jess warden 的话说:使用 Delegate 可以使你变得更聪明!
Delegate 也可以工作在除了组件之外的低级别事件中,例如,你可以使用 movieclip’s onEnterFrame 事件或一个 xml 对象的 onLoad 事件,如下:
代码: |
import mx.utils.Delegate; function xmlLoaded(success) function handleEnterFrame() var myXML = new XML(); //myMc 为当前帧上一个影片剪辑 |
通过使用 Delegate 结合低级别事件它可以让你很轻松的解决在调用中的范围问题,这意味着可以大量的减少使用_root.
另一个使用 Delegate 的技巧方法是与 setInterval 结合使用。中心是当在间隔一定时间不断调用函数时,范围有些时候不会被一直传递,因些 trace(this); 会显示为 undefined.,你可以使用下面的代码方法解决这个问题。
代码: |
import mx.utils.Delegate; function traceThis() var myInt = setInterval(Delegate.create(this, traceThis), 1000); |
它可以工作的很好,不管是在时间线上还在类的内部,意味着你不必使用原有 setInterval 的类型为 string 的第二调用,如果不理解请参看 FLASH 帮助。它是非常好的,因为原有的 setinterval 在实际应用中显得不是很可靠,而第一调用是不可动摇的。另外,第一调用可以被编译器检查因为它是对函数的引用而不是针对 string 字符串。
通过上面我们使用 Delegate.crea
te 和 this 做为第一参数,其它的 99% 的时间你需要的是怎么样去使用它。然而在一些环境中你可以将 Delegatey 应用在其它内容上而不光是 this.Delegate 将变成一个你按制影片的好方法。