委托事件

您可以将 Delegate 类导入到脚本或类中,以便将事件委托给特定的范围和函数(请参阅"组件语言参考"中的Delegate 类)。要导入 Delegate 类,请使用以下语法:

import mx.utils.Delegate;
compInstance.addEventListener("eventName", Delegate.create(scopeObject, function));

scopeObject 参数指定一个范围,指定的 function 参数在该范围中被调用。

调用 Delegate.create() 有两个常见用途:

将事件委托给函数

如果有两个广播同名事件的组件,则调用 Delegate.create() 十分有用。例如,如果您有一个复选框和一个按钮,为了确定哪个组件正在广播 click 事件,则您将必须对从 eventObject.target 属性中获取的信息使用 switch 语句。

要使用下面的代码,请将名为 myCheckBox_chb 的复选框和名为 myButton_btn 的按钮放置到舞台上。选择这两个实例,再按 F8 键创建一个新元件。如果对话框处于基本模式,请单击"高级",然后选择"为 ActionScript 导出"。在"AS 2.0 类"文本框中输入 Cart。在属性检查器中,按您的意愿设置新元件的名称。现在该元件与 Cart 类相关联,元件的实例变成该类的实例。

import mx.controls.Button;
import mx.controls.CheckBox;

class Cart {
    var myCheckBox_chb:CheckBox;
    var myButton_btn:Button;

    function onLoad() {
        myCheckBox_chb.addEventListener("click", this);
        myButton_btn.addEventListener("click", this);
    }

    function click(eventObj:Object) {
        switch(eventObj.target) {
            case myButton_btn:
                // 将广播器实例名称和
                // 事件类型发送到"输出"面板
                trace(eventObj.target + ": " + eventObj.type);
                break;
            case myCheckBox_chb:
                trace(eventObj.target + ": " + eventObj.type);
                break;
        }
    }
}

以下代码是为使用 Delegate 而经过修改的同一类文件 (Cart.as) 中的代码:

import mx.utils.Delegate;
import mx.controls.Button;
import mx.controls.CheckBox;

class Cart {
    var myCheckBox_chb:CheckBox;
    var myButton_btn:Button;

    function onLoad() {
        myCheckBox_chb.addEventListener("click", Delegate.create(this, chb_onClick));
        myButton_btn.addEventListener("click", Delegate.create(this, btn_onClick));
    }

// 两个单独的函数处理事件

    function chb_onClick(eventObj:Object) {
        // 将广播器实例名称和
        // 事件类型发送到"输出"面板
        trace(eventObj.target + ": " + eventObj.type);
        // 将 FLA 文件中与 Cart 类
        // 相关联的元件的绝对路径
        // 发送到"输出"面板
        trace(this)
    }

    function btn_onClick(eventObj:Object) {
        trace(eventObj.target + ": " + eventObj.type);
    }
}

委托函数的范围

addEventListener() 方法有两个参数:一个事件的名称和一个对侦听器的引用。侦听器可以是一个对象或一个函数。如果传递一个对象,则会在该对象的范围内调用分配给该对象的回调函数。但是,如果传递一个函数,则会在调用 addEventListener() 的组件实例的范围内调用该函数。(有关详细信息,请参阅关于侦听器中的范围。)

因为是在广播器实例的范围内调用函数,所以函数体内的关键字 this 指向的是广播器实例,而不是包含该函数的类。因此,您无法访问包含该函数的类的属性和方法。请使用 Delegate 类将函数的范围委托到包含类,以便可以访问包含类的属性和方法。

下面的示例对 Cart.as 类文件的变体使用与上一部分相同的方法(请参阅将事件委托给函数):

import mx.controls.Button;
import mx.controls.CheckBox;

class Cart {

    var myCheckBox_chb:CheckBox;
    var myButton_btn:Button;

    // 定义一个变量以从
    // chb_onClick 函数访问
    var i:Number = 10

    function onLoad() {
        myCheckBox_chb.addEventListener("click", chb_onClick);
    }

    function chb_onClick(eventObj:Object) {
        // 您期望可以访问
        //变量 i 并输出 10。
        // 但是,这将未定义的值发送
        // 到"输出"面板,因为
        // 该函数的范围并不是
        // 定义 i 的 Cart 实例。
        trace(i);
    }
}

要访问 Cart 类的属性和方法,请调用 Delegate.create() 作为 addEventListener() 的第二个参数,如下所示:

import mx.utils.Delegate;
import mx.controls.Button;
import mx.controls.CheckBox;

class Cart {
    var myCheckBox_chb:CheckBox;
    var myButton_btn:Button;
    // 定义一个变量以从
    // chb_onClick 函数访问
    var i:Number = 10

    function onLoad() {
        myCheckBox_chb.addEventListener("click", Delegate.create(this, chb_onClick));
    }

    function chb_onClick(eventObj:Object) {
        // 将 10 发送到"输出"面板 
        // 因为函数的范围是
        // Cart 实例
        trace(i);
    }
}