Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/actionscript-3/7.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Actionscript 3 在AS3中发送事件时,适当的形式是什么?_Actionscript 3_Events_Coding Style_Event Dispatching - Fatal编程技术网

Actionscript 3 在AS3中发送事件时,适当的形式是什么?

Actionscript 3 在AS3中发送事件时,适当的形式是什么?,actionscript-3,events,coding-style,event-dispatching,Actionscript 3,Events,Coding Style,Event Dispatching,我想知道创建自定义事件时的适当形式是什么?应该创建一个CustomEvent类,然后在函数中创建一个临时分派器,并分派CustomEvent。还是最好尝试创建CustomEventDispatcher类,并将CustomEvent类创建为该类的内部类,例如: package { public class CustomEventDispatcher extends EventDispatcher { public function CustomEventDispatcher

我想知道创建自定义事件时的适当形式是什么?应该创建一个CustomEvent类,然后在函数中创建一个临时分派器,并分派CustomEvent。还是最好尝试创建CustomEventDispatcher类,并将CustomEvent类创建为该类的内部类,例如:

package
{

   public class CustomEventDispatcher extends EventDispatcher
   {
     public function CustomEventDispatcher()
     {
       super(new CustomEvent());
     }

   }
}

class CustomEvent
{
   public function CustomEvent(type:String, bubbles:Boolean=false, cancelable:Boolean=false)
   {
      super(type, bubbles, cancelable)
   }                                               
}

单方面而言,最好是让公众能够访问事件。通过这种方式,您可以键入侦听器(有利于代码提示和调试),并使事件具有公共静态常量类型(您可能也希望查看这些类型)。

不要忘记覆盖克隆。重写toString进行调试也是一个好主意

下面是我的一个自定义事件的示例:

package com.mattie.events
{
//Imports
import flash.events.Event;

//Class
public class SearchFieldEvent extends Event
    {
    //Constants
    public static const SEARCH_COMPLETE:String = "search complete";

    //Variables
    public var totalResults:uint;
    public var duration:uint;
    public var searchText:String;

    //Constructor
    public function SearchFieldEvent(type:String, totalResults:uint = 0, duration:uint = 0, searchText:String = "") 
        {
        super(type);

        this.totalResults = totalResults;
        this.duration = duration;
        this.searchText = searchText;
        }

    //Override clone
    public override function clone():Event
        {
        return new SearchFieldEvent(type, totalResults, duration, searchText);
        }

    //Override toString
    public override function toString():String
        {
        return formatToString("SearchFieldEvent", "type", "totalResults", "duration", "searchText");
        }
    }
}

在构思事件机制时,有两个基本问题需要回答

1) 如何为我的事件创建dispatcher实例

常规选项有:扩展EventDispatcher或聚合dispatcher实例

最基本和最常见的实践(官方文档也说明了这一点)是扩展EventDispatcher类,从而为类提供事件调度功能

优点:易于实现——只需键入extensedeventdispatcher,您就完成了

缺点:您不能扩展其他内容。显然,这就是为什么许多本机类都是EventDispatcher的孙子。我想只是为了省去我们的麻烦

第二种通用方法是聚合调度程序实例

package
{
    import flash.events.Event;
    import flash.events.EventDispatcher;
    import flash.events.IEventDispatcher;

    public class ClassA implements IEventDispatcher
    {
        private var dispatcher:EventDispatcher;

        public function ClassA()
        {
            initialize();
        }

        private function initialize():void
        {
            dispatcher = new EventDispatcher(this);
        }

        public function addEventListener(type:String, listener:Function, useCapture:Boolean = false, priority:int = 0, useWeakReference:Boolean = false):void
        {
            dispatcher.addEventListener(type, listener, useCapture, priority, useWeakReference);
        }

        public function removeEventListener(type:String, listener:Function, useCapture:Boolean = false):void
        {
            dispatcher.removeEventListener(type, listener, useCapture);
        }

        public function dispatchEvent(event:Event):Boolean
        {
            return dispatcher.dispatchEvent(event);
        }

        public function hasEventListener(type:String):Boolean
        {
            return dispatcher.hasEventListener(type);
        }

        public function willTrigger(type:String):Boolean
        {
            return dispatcher.willTrigger(type);
        }
    }
}
注意:我们将对聚合类的引用传递给dispatcher构造函数。 这样做是为了使event.target引用您的类实例,而不是dispatcher实例本身

优点:您可以自由扩展您喜欢的内容。您可以使用dispatcher钩子执行一些技巧,例如维护侦听器列表或类似的操作

缺点:没有第一种方法那么简单

2) 如何通过事件传递自定义数据

常规选项有:在事件实例中传递数据,或仅使用事件处理程序中的event.target引用从源访问某些数据

若您选择通过event.target访问所有必要的数据——不需要额外的工作,只需将事件处理程序中的此引用强制转换为相应的类

如果您想随事件一起传递一些数据,您可以将event子类化,并且这个类应该对处理事件的代码公开可见,正如上面的答案所述。AS3是关于严格和强大的打字,那么你为什么要抵制它呢


仅当要重新修补已处理的事件时,才需要重写事件子类中的clone()方法。官方文档说,为了安全起见,每次创建自定义事件类时都必须这样做。

所有这些都是很好的答案,但这里的清晰和相对全面的回答是我最喜欢的。再加上简单的赞成-反对方法也没什么坏处。非常感谢你。另外,您是否在构造函数中使用私有函数调用来实现JIT优化?嗯,我总是在单独的函数中进行初始化。这并不是说编译器没有优化构造函数代码:它使您的代码更加灵活,因为您可以推迟调用init方法。