0

アプリケーション全体にデータを配信するのに役立つことを発見したことを共有しようと思った 他の人がこれについてどう思うか疑問に思っている 他のコンポーネントにバブリングするイベントをキャプチャする方法が欲しかったが、それが簡単になる方法で5月のアプリのどこでも使用できるので、これが私が思いついたものです。

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

ベース ビュー コントローラー/メディエーターを実装する場合 (使用するフレームワークによって異なります)、フレームワーク以外のクラスへの参照がまったくないため、再利用性が高くなります。これは、システム全体のイベントをディスパッチするために使用するアプリケーション シングルトンの単純な再利用です。ビューコントローラー/メディエーターにリスナーを登録し、それに応じてビューまたはモデルを更新します。たとえば、RobotLegs は、システム全体のイベント ディスパッチャも使用します。

なぜparentApplicationアプローチを使用しないのですか? テストを実装できないため (IDE の生成されたテスト ランナーは AxApplication を拡張しません)、または別のアプリケーションでコンポーネント/モデルをヤンクするだけです。これは基本的に不可能です。

于 2013-01-12T09:53:05.040 に答える