我无法弄清楚如何为我的应用程序构建控制台,以便我可以从包中的任何类向其发送消息。
我试图发送一个通用事件,但我找不到与事件一起发送msg的方法,或者至少是对调度事件的对象的引用。
你会建议什么方法?
答案 0 :(得分:3)
使用动态关键字的自定义事件将像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项目,您都希望使用此类自定义事件,不仅可以发送各种通知,还可以携带明确定义的严格类型的数据有效负载。
答案 1 :(得分:0)
最简单的方法是创建一个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);
}
}
}
通过将此类设置为动态(使用动态关键字),您可以向事件对象添加值:
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);
}
答案 2 :(得分:0)
我尝试了你们建议的内容..这是我的事件代码
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);