Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/flash/4.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
Flash AS 3.0构建消息控制台方法_Flash_Actionscript 3_Events - Fatal编程技术网

Flash AS 3.0构建消息控制台方法

Flash AS 3.0构建消息控制台方法,flash,actionscript-3,events,Flash,Actionscript 3,Events,我很难弄清楚如何为我的应用程序构建一个控制台,这样我就可以从包中的任何类向它发送MSG 我试图发送一个通用事件,但我找不到一种方法将消息与事件一起发送,或者至少是对正在调度事件的对象的引用 您建议采用什么方法?最简单的方法是创建一个DynamicEvent类,您可以将任何消息添加到该类中 package { import flash.events.Event; dynamic public class DynamicEvent extends Event { pu

我很难弄清楚如何为我的应用程序构建一个控制台,这样我就可以从包中的任何类向它发送MSG

我试图发送一个通用事件,但我找不到一种方法将消息与事件一起发送,或者至少是对正在调度事件的对象的引用


您建议采用什么方法?

最简单的方法是创建一个DynamicEvent类,您可以将任何消息添加到该类中

package {
    import flash.events.Event;
    dynamic public class DynamicEvent extends Event {
        public function DynamicEvent(t:String, b:Boolean = false, c:Boolean = false){
            super(t, b, c);
        }
    }
}
通过将此类设置为动态(使用dynamic关键字),您可以向事件对象添加值:

var _dynEvent:DynamicEvent = new DynamicEvent(LOAD_PROGRESS);
_dynEvent.id = _id;
_dynEvent.bytesLoaded = bytesLoaded;
dispatchEvent(_dynEvent);
然后,当您收听事件时:

function eventHandler(e:DynamicEvent):void{
    trace(e.bytesLoaded);
    trace(e.id);
}

带有dynamic关键字的定制活动将如Danjp的帖子中所宣传的那样有效,但我建议在任何类型的大型项目上都不要使用它。您失去了严格键入信息有效负载的能力—例如,如果其他人必须编辑您的代码,他们可能不知道您的事件上有一个动态生成的“myData”属性。这将给以后试图编辑代码的人带来无尽的麻烦

“正确”的方法是使用保存数据的强类型成员创建自定义事件。例如:

package com.yourdomain.events {
    import flash.events.Event;
    import com.yourdomain.model.vo.MyValueObject;

    public class MyEvent extends Event {
        public var myVO:MyValueObject;
        public function MyEvent(type:String):void {
            super(type);
        }
    }
}
所以,是的,简而言之就是这样。你需要用谷歌搜索精确的格式,我的是简化的-你的super()调用应该有其他参数,你需要覆盖clone()方法。但这里的优点是,任何检查代码的人都确切地知道要寻找哪种数据类型作为有效负载。在本例中,它是MyValueObject的一个实例


如果您有任何关于原因的具体问题,请告诉我,但这只是一般的想法。每当你做一个大型AS3项目时,你都会希望使用像这样的自定义事件,不仅可以发送各种通知,还可以携带定义明确、类型严格的数据有效载荷。

我尝试了你们建议的方法。。这是我的活动代码

public class ConsoleEvent extends Event
{
    public var variable: String;
    public function ConsoleEvent( variable1: String, type:String='message',bubbles:Boolean=false, cancelable:Boolean=false)
    {
        super(type, bubbles, cancelable);
        this.variable = variable1;
    }
    override public function clone():Event
    {
        return new ConsoleEvent ( variable,type, bubbles, cancelable);
    }

}
}
但这是痕迹

[Event type="message" bubbles=false cancelable=false eventPhase=2]
我对这件事了如指掌

reader.addEventListener('message', consoleadd);

您可能还需要重写事件的clone()方法--请参阅。对于动态事件,这可能很棘手。@Cameron:您可以在for-in循环中获取所有动态属性@丹:我不会那样做的。而是使用类型为
*
的属性
data
存储随事件传递的所有数据。这样就不会与
事件
的属性(例如
类型
目标
)发生冲突。@Cameron@back2dos-是的,你们都是对的。这很简单,(请阅读“快速和肮脏”),虽然我不会对任何大型项目这样做,但这很有可能是可以的。后续问题请参见下面我的答案是的,您做得很好-在“consoleadd”函数中,而不是说“trace(event)”说“trace(event.variable)”。这里有一个实际事件对象的跟踪,它提供了所有标准事件信息。如果需要,可以在自定义事件中重写公共函数toString():String,以跟踪除类型、气泡、可取消和阶段之外的变量。如果这有道理的话。但是,是的,处理程序中的event.variable将提供您想要的!