2

AMF を介してサーバーからデータを遅延ロードするための確立されたパターンがあります。

    private var _XeventDispatched:Boolean;
    private var _X:ArrayCollection;
    public function get X():ArrayCollection{
        if(!_XeventDispatched && (_X==null || _X.length==0)){
            var evt:Event = new Event();//whatever event is need for this data member
            dispatcher.dispatchEvent(evt);
            _XeventDispatched = true;
        }
        return _X;
    }
    public function set X(ac:ArrayCollection):void{
        return _X;
    }

このようにして、データは必要になるまでサーバーからロードされません。(ちなみに、私は Mate フレームワークを使用しているため、UI がインスタンス化され、インジェクターが起動すると、データ マネージャー クラスでこの get メソッドが呼び出されます。)

私がやりたいのは、パブリック プロパティの代わりに上記のメソッドを追加する [Bindable] に似た、ある種のメタデータ タグを作成することです。

[LazyLoaded(eventName="com.myCompany.LoadX")]
public var X:ArrayCollection;

コンパイラには、このタイプの拡張用のフックがありますか? 読みにくい定型コードを大幅に節約できます。

4

3 に答える 3

2

Flextra が述べたように、1 つのオプションは、メタデータのランタイム リフレクションを使用し、これを中心にフレームワークを構築することです。

これは、dpHibernate (私が開発者として使用している Flex Lazy Loading フレームワーク) に Lazy Loading が実装されている方法と似ています。具体的には、ゲッターとセッターにアクセスし、遅延読み込み用のフックでそれらをインターセプトするために、[Managed]メタタグを利用し、その動作を微調整して、コンパイラーにフックを組み込みます。

少しハックですが、役立つかもしれません。(そして、そのハックの上にかなり成功したフレームワークを構築しました)。

または、メタデータを使用する独自のコンパイラ拡張機能を記述し、AST の変更を実行してそのコードを生成することもできます。ただし、気弱な人向けではありません。

これらの拡張機能のフックは何年も前から存在していますが、それを行う方法についてはほとんど知られていないため、既存のソースを調べて解決する必要があります。

幸いなことに、アドビの関係者はコンパイラの拡張機能に関して独自のドッグフードを食べていて、Flex 4 の機能のいくつか (スキニングなど) がコンパイラの拡張機能として実装されており、さらにいくつかの例を使用することができます。

コンパイラのソースは、こちらから入手できます。出発点として、マネージ拡張機能のコードを確認することをお勧めします。

または、SkinPart拡張機能、HostComponent拡張機能、または [ Embed ] (コンパイラの最初の開発者である Clement Wong が、コンパイラ拡張機能を理解するための最良の出発点として言及したもの) を調べてください。

于 2011-09-29T22:01:03.250 に答える
0

+1マーティあなたは私をこれに導きましたが、あなたの解決策とは異なります.

他のすべての Mate データ マネージャーから拡張できる基本クラス ( BaseDataManager) を作成し、そのクラスに以下のコードを追加しました。

        private var eventsDispatched:Array = new Array();
        protected function lazyLoad(value:*, eventType:String):*{
            if(!eventsDispatched[event] && (value==null || (value is IList && IList(value).length==0))){

                var clazzName:String = eventType.substr(0, eventType.indexOf(":"));
                var eventClazz:Class = Class(getDefinitionByName(clazzName));
                var event:Event = new eventClazz(eventType);

                dispatcher.dispatchEvent(event);
                eventsDispatched[event] = true;
            }
            return value;
        }

次に、各データマネージャー内で、プロパティが遅延ロードされる場合、これはそれらのアクセサーです。

    private var _X:ArrayCollection;
    public function get X():ArrayCollection{
        return lazyLoad(_X, XLoadEvent.LOAD_EVENT_TYPE);
    }
    public function set X(value:ArrayCollection):void{
        _X = value;
    }

このようにして、醜くて読みにくいコードのほとんどは開発者から隠されますが、問題が発生した場合でもデバッグのためにアクセスできます。

于 2011-09-30T14:08:15.793 に答える
0

keep--as3-metadata コンパイラ引数を使用したいと思います。このようなもの:

keep-as3-metadata+=LazyLoaded

于 2011-09-28T16:22:15.260 に答える