Actionscript 3 应用程序设计模式AS3

Actionscript 3 应用程序设计模式AS3,actionscript-3,events,design-patterns,data-binding,flash-builder,Actionscript 3,Events,Design Patterns,Data Binding,Flash Builder,我想我会分享一些我发现的有助于在应用程序中传递数据的东西,我想知道其他人对此有何看法我想有一种方法来捕获冒泡事件,并将其返回到其他组件,但在某种程度上,它将使它易于在应用程序中的任何地方使用,所以这就是我想到的 我扩展了应用程序类,将其封装在一个抽象函数中,在任何地方注册任何组件的函数,并在最顶层捕获它,然后传递到我选择的任何地方 public class AxApplication extends Application { public var ___registeredEvents

我想我会分享一些我发现的有助于在应用程序中传递数据的东西,我想知道其他人对此有何看法我想有一种方法来捕获冒泡事件,并将其返回到其他组件,但在某种程度上,它将使它易于在应用程序中的任何地方使用,所以这就是我想到的

我扩展了应用程序类,将其封装在一个抽象函数中,在任何地方注册任何组件的函数,并在最顶层捕获它,然后传递到我选择的任何地方

public class AxApplication extends Application
{
    public var ___registeredEvents:Array = new Array();
    public var ___registeredFunctions:Array = new Array();
    function AxApplication()
    {
        super();
    }
    public function localRegisterForEvent(e:Event,func:*,caller:*):void
    {
        caller.addEventListener(e.type,localCallerEventHandler,true,3);
        caller.addEventListener(e.type,localCallerEventHandler,false,3);
        ___registeredEvents.push(e);
        ___registeredFunctions.push(func);
    }
    public function localCallerEventHandler(e:*):void
    {
        if(e!=null)
        {
            for(var i:int = 0 ; i<  ___registeredEvents.length; i++)
            {
                if(e.type == ___registeredEvents[i].type)
                {
                    ___registeredFunctions[i](e);

我认为这不是一个非常有用的解决办法。为什么?因为您将应用程序引用分散在应用程序周围。视图和模型实例根本不需要对应用程序的任何引用。最好实现一个使用简单eventBus属性的控制器层,该属性可以如下所示:

private static const _EVENT_BUS:IEventDispatcher = FlexGlobals.topLevelApplication;

protected final function eventBus():IEventDispatcher {
  return _EVENT_BUS;
}
如果您实现了一个基本视图控制器/中介(取决于您来自哪个框架),那么您根本没有对非框架类的任何引用,这使得它具有高度的可重用性。它只是简单地重用用于调度系统范围事件的应用程序单例。您可以在视图控制器/中介器中注册侦听器,并相应地更新视图或模型。例如,RobotLegs也使用系统范围的事件调度器


为什么不使用parentApplication方法呢?因为您无法实现测试(生成的IDE测试运行程序不会扩展您的AxApplication),或者只是在不同的应用程序中拖动组件/模型-这基本上是不可能的。

我想我应该提到的一件事是如何使用它,您可以这样使用它:AxApplication(this.parentApplication)。localRegisterForEvent(新事件(Event.SOME\u事件)、someFunctionHandler、callingObject);调用对象是将输出事件的对象,只要你在应用程序中注册该对象一次,它就会将其传回任何地方,而无需任何编码来获取数据。好的,很好,我不知道事件总线是我出来并抛出我的想法的原因,因为我需要找到一个更复杂的方法要管理事件和数据,无需对每一层进行编码或处理事件调度。但回到您的响应上来,因为当时我正在考虑flexGlobals对象,关于它的使用的参考非常少,如果我没有记错的话,flexGlobals.TopLevelApplication是应用程序的一个属性,您可以正确地定义为一个抽象类/对象,它将位于代码和框架之间……该对象将在应用程序的整个生命周期中始终关注应用程序函数调用?我必须恭敬地请您提供一个flexGlobals.TopLevelApplication用户的小示例。:)感谢我的解决方案的要点是,您的控制器层仅依赖于eventBus属性才能工作。控制器的所有实例都将使用同一实例来调度事件。但是,与您的解决方案相比,您不需要更多的知识。当您想要重用某些方面时,编译器将因您需要的类型转换而中断。此外,在我的解决方案中,您可以为总线添加一个set属性,并向IEventDispatcher注入一个引用。这使得它与任何依赖注入框架兼容。当使用一个d.i.框架时,你可以使用任何你想要的实例,因为它将被注入控制器并隐藏分派器的具体实现。
private static const _EVENT_BUS:IEventDispatcher = FlexGlobals.topLevelApplication;

protected final function eventBus():IEventDispatcher {
  return _EVENT_BUS;
}