使用 Delegate 类

Delegate 类允许您在特定作用域内运行函数。提供了这个类之后,您就可以将同一个事件调度给两个不同的函数(请参见"使用组件"中的将事件委托给函数),并可以在包含类的作用域内调用函数。

当将一个函数作为参数传递给 EventDispatcher.addEventListener() 时,会在广播器组件实例的作用域内调用该函数,而不是在声明该函数的对象的作用域内调用(请参见"使用组件"中的委托函数的范围)。您可以使用 Delegate.create() 在声明对象的作用域内调用函数。

以下示例演示了侦听 Button 组件实例的事件的三种方法。使用不同的方法向 Button 组件实例添加事件侦听器,会使事件在不同作用域内调度。

使用 Delegate 类侦听事件:

  1. 创建一个新的 Flash 文档,并将它保存为 delegate.fla
  2. 将一个 Button 组件从"组件"面板的 User Interface 文件夹拖到库中。

    在以后的步骤中,使用 ActionScript 将该按钮实例添加或放置在舞台上。

  3. 将下面的 ActionScript 添加到主时间轴中的第 1 帧:
    import mx.controls.Button;
    import mx.utils.Delegate;
    
    function clickHandler(eventObj:Object):Void {
        trace("[" + eventObj.type + "] event on " + eventObj.target + " instance.");
        trace("\t this -> " + this);
    }
    
    var buttonListener:Object = new Object();
    buttonListener.click = function(eventObj:Object):Void {
        trace("[" + eventObj.type + "] event on " + eventObj.target + " instance.");
        trace("\t this -> " + this);
    };
    
    this.createClassObject(Button, "one_button", 10, {label:"One"});
    one_button.move(10, 10);
    one_button.addEventListener("click", clickHandler);
    
    this.createClassObject(Button, "two_button", 20, {label:"Two"});
    two_button.move(120, 10);
    two_button.addEventListener("click", buttonListener);
    
    this.createClassObject(Button, "three_button", 30, {label:"Three"});
    three_button.move(230, 10);
    three_button.addEventListener("click", Delegate.create(this, clickHandler));
    

    前面的代码分为六个部分(各部分之间用空行分隔)。第一部分导入 Button 类(针对 Button 组件)和 Delegate 类。代码的第二部分定义用户单击某些按钮时调用的函数。代码的第三部分创建用作事件侦听器的对象,该对象侦听单个 click 事件。

    代码剩下的三部分可单独在舞台上创建一个新的 Button 组件实例,重新放置实例,以及添加 click 事件的事件侦听器。第一个按钮添加 click 事件的事件侦听器,并直接传递对 click 处理函数的引用。第二个按钮添加 click 事件的事件侦听器,并传递对包含 click 事件的处理函数的侦听器对象的引用。最后,第三个函数添加 click 事件的事件侦听器,使用 Delegate 类在 this 作用域内调度 click 事件(其中 this 等于 _level0),并传递对 click 处理函数的引用。

  4. 选择"控制">"测试影片"对该 Flash 文档进行测试。
  5. 单击舞台上的每个按钮实例,查看处理该事件的作用域。
    1. 单击舞台上的第一个按钮,在"输出"面板中跟踪以下文本:
      [click] event on _level0.one_button instance.
           this -> _level0.one_button
      

      单击 one_button 实例时,this 作用域引用该按钮实例本身。

    2. 单击舞台上的第二个按钮,在"输出"面板中跟踪以下文本:
      [click] event on _level0.two_button instance.
           this -> [object Object]
      

      单击 two_button 实例时,this 作用域引用 buttonListener 对象。

    3. 单击舞台上的第三个按钮,在"输出"面板中跟踪以下文本:
      [click] event on _level0.three_button instance.
           this -> _level0
      

      单击 three_button 实例时,this 作用域引用在 Delegate.create() 方法调用中指定的作用域,在这个示例中为 _level0