【问题标题】:Application Design Patterns AS3应用程序设计模式 AS3
【发布时间】:2013-01-12 01:56:41
【问题描述】:

只是想我会分享一些我发现的东西来帮助跨应用程序传递数据我想知道其他人对此有何看法使它易于在 May 应用程序的任何地方使用,所以这就是我想出的。

我扩展 Application 类并包装在一个抽象函数中,该函数在任何地方注册任何组件的函数,并在最顶层捕获它并传递到我选择的任何地方。

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);

//注册的函数被调用 //没有实现垃圾回收!

                }
            }
        }
    }


}

【问题讨论】:

  • 我想我应该提到的一件事是如何使用它你可以像这样使用它:
  • AxApplication(this.parentApplication).localRegisterForEvent(new Event(Event.SOME_EVENT),someFunctionHandler,callingObject);调用对象就是将输出事件的对象,只要您在应用程序中注册该对象一次,它就会将其传递回任何地方,而无需任何编码以多次获取数据。

标签: actionscript-3 events design-patterns data-binding flash-builder


【解决方案1】:

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

private static const _EVENT_BUS:IEventDispatcher = FlexGlobals.topLevelApplication;

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

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

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

【讨论】:

  • 好吧,我不知道事件总线女巫是我出来并抛出我的想法的原因,因为我需要找到一个更复杂的来管理事件和数据,而不必编码每一层或处理事件分派。但是回到你的回复,因为当时我正在考虑 flexGlobals 对象,并且关于它的使用的参考相当少,如果我没记错的话 flexGlobals.TopLevelApplication 是应用程序的一个属性,你可以明确定义为将位于您的代码和框架之间的抽象类/对象...
  • 这个对象会在应用程序的整个生命周期中持续关注应用程序函数调用吗?我必须恭敬地请求您提供一个 flexGlobals.TopLevelApplication 用户的小示例。 :) 谢谢
  • 我的解决方案的重点是,您是控制器层仅取决于 eventBus 属性才能工作。控制器的所有实例都将使用同一个实例来调度事件。但是与您的解决方案相比,不需要更多的知识。当你想重用某些方面时,编译器会因为你需要的类型转换而中断。
  • 另外,在我的解决方案中,您可以为总线添加一个 set 属性并注入对 IEventDispatcher 的引用。这使其与任何依赖注入框架兼容。当使用 d.i.框架,你可以使用任何你想要的实例,因为它将被注入控制器并隐藏调度程序的具体实现。
  • 我不明白重点 - 方面,你在想。
猜你喜欢
  • 1970-01-01
  • 2013-08-23
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2010-11-09
  • 1970-01-01
相关资源
最近更新 更多