0

只是想我会分享一些我发现的东西来帮助跨应用程序传递数据我想知道其他人对此有何看法在 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);

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

                }
            }
        }
    }


}
4

1 回答 1

0

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

private static const _EVENT_BUS:IEventDispatcher = FlexGlobals.topLevelApplication;

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

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

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

于 2013-01-12T09:53:05.040 回答