Директива компилятора Actionscript - PullRequest
2 голосов
/ 28 сентября 2011

У меня установлен шаблон для отложенной загрузки данных с сервера через 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, поэтому, когда пользовательский интерфейс создается, и инжекторы запускаются, они вызывают этот метод get в классе менеджера данных.)

Что я хотел бы сделать, так этосоздайте какой-нибудь тег метаданных, подобный [Bindable], который добавит вышеуказанные методы вместо открытого свойства.

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

Есть ли у компилятора какие-либо хуки для этого типа расширения?Это сэкономит много кода, который трудно прочитать.

Ответы [ 3 ]

2 голосов
/ 30 сентября 2011

Как уже упоминалось в Flextra, одним из вариантов является использование отражения метаданных во время выполнения и построение вашей среды вокруг этого.

Это похоже на то, как Lazy Loading внедряется в dpHibernate (Flex Lazy Loading framework, который яразработчик).В частности, чтобы получить доступ к геттерам и сеттерам и перехватывать их с помощью ловушек для отложенной загрузки, мы используем метатег [Managed] и настраиваем его поведение , которое заставляет компилятор создавать для вас ловушки.

Это что-то вроде хака, но это может вам помочь.(И мы создали довольно успешный фреймворк поверх этого хака).

В качестве альтернативы, вы можете написать свои собственные расширения компилятора, которые используют ваши метаданные и выполняют модификации AST для генерации этого кода для вас.Тем не менее, это не для слабонервных.

Хотя зацепки для этих расширений существуют уже много лет, очень мало есть о том, как это сделать, и вам придется работатьэто, просматривая существующий исходный код.

К счастью, сотрудники Adobe едят свою собачью еду в отношении расширений компилятора, и некоторые функции Flex 4 (такие как Skinning) были реализованы.в качестве расширений компилятора, предоставляя вам еще несколько примеров для работы.

Исходный код компилятора доступен здесь. Может быть стоит взглянуть на код для Управляемого расширения как хорошая отправная точка.

В качестве альтернативы взгляните на расширение SkinPart , расширение HostComponent или [ Embed ] (которое Клемент Вонг - первоначальный разработчиккомпилятор - однажды упомянутый как лучшая отправная точка в понимании расширений компилятора).

0 голосов
/ 30 сентября 2011

+ 1 Марти, ты привел меня к этому, но это отличается от твоего решения.

Я создал базовый класс (BaseDataManager), из которого могут расширяться все другие менеджеры данных Mate, и в этом классе я добавил следующий код:

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

Таким образом, большая часть ужасного, трудно читаемого кода скрыта от разработчика, но все же доступна для отладки, если возникнут какие-либо проблемы.

0 голосов
/ 28 сентября 2011

Я думаю, вы хотите использовать аргумент компилятора keep - as3-метаданных . Примерно так:

держать-as3-метаданные + = LazyLoaded

...