2

我是动作脚本的新手,并试图理解现有代码。这里我有 MyRestServiceEvent 和 MyRestService。MyRestService 类中定义了许多方法,它们调度许多事件,但有些实现dispatchEvent(evt.clone());我无法理解。我知道 MyRestServiceEvent 已经实现了 clone(),那么这是做什么的dispatchEvent(evt.clone());呢?如果有人可以向我解释这个过程,我真的很感激。

下面是这两个类的一个小快照。

事件类

        public function MyRestServiceEvent(type:String, request:MyRestRequest, result:* = null, bubbles:Boolean=false, cancelable:Boolean=false)
        {
            super(type, bubbles, cancelable);

            this.result = result;
            this.request = request;
        }

        /**
         * Override clone to support re-dispatching
         */
        override public function clone():Event
        {
            return new MyRestServiceEvent(type, this.request, this.result, bubbles, cancelable);
        }
    }
}

事件调度程序类

public class MyRestService extends EventDispatcher
    {

        // ton of methods here but below is an example of one of the functions 

        private function checkAdminErrorHandler(evt:MyRestServiceEvent):void
        {
            dispatchEvent(evt.clone());
        }
}
4

2 回答 2

3

clone()方法创建 Event 对象的重复实例。它通过创建类的新实例并将其属性设置为与原始实例相同的值来实现。自定义事件可能会覆盖此方法以正确处理引用类型的复制。

重新调度事件时需要克隆,以便可以将其只读属性(bubbles、cancelable、currentTarget、target)再次设置为新值。

于 2013-08-01T07:53:20.623 回答
2

您的代码示例中的克隆是完全多余的——dispatchEvent 实际上调度了一个克隆(因此需要在自定义事件中[覆盖]克隆方法),因此不需要向它传递一个克隆。这段代码的工作原理完全相同:

dispatchEvent(evt);

至于为什么要重新调度事件,我猜是因为事件冒泡设置为假。因此,重新调度事件有效地将其“冒泡”到应用程序的另一层,以便更多“东西”可以监听它。

于 2013-08-04T17:29:21.377 回答