Записи с меткой: AS3

Статья о создании расширений на Хабре

Потратив 2 дня, добился создания рабочего расширения на PureBasic(кроссплатформенный язык). Статья лежит здесь http://habrahabr.ru/post/147089/.

Скачать код и рабочую версию можно здесь http://code.google.com/p/purebasic-extension-for-adobe-air/

Реклама

, , ,

Оставить комментарий

Наступаем на грабли IDropInListItemRenderer

Иногда бывает необходимость получить доступ из рендерера к листу, в котором этот рендерер находится. Для этого необходимо заиплементить интерфейс IDropInListItemRenderer и затем взять поле owner у полученной на руки BaseListData. Это все будет прекрасно работать до тех пор, пока лист не окажется пустым:

        if (item is IDropInListItemRenderer)
        {
            if (data != null)
                IDropInListItemRenderer(item).listData = makeListData(data, itemToUID(wrappedData), 0);
            else
                IDropInListItemRenderer(item).listData = null;
        }

Поэтому использовать интерфейс IDropInListItemRenderer необходимо с осторожностью, либо передавать ссылку на лист через конструктор.

, ,

Оставить комментарий

Как передать дополнительные параметры в слушатель (addEventListener передать переменную)

Многим приходилось сталкиваться с необходимостью передать дополнительные параметры в слушатель (listener). Мне это понадобилось для реализации ленивой загрузки(lazy loading) в дереве.

Как это работает:

  • пользователь нажимает на крестик
  • отправляется запрос на сервер (подгрузка нодов)
  • отображение загруженных нодов

Таким образом, возникает необходимость хранить где-то дополнительную информацию — куда вставить загруженные ноды? Есть конечно возможность выкрутиться: заполнить на сервере в нодах, например, parentID, затем искать по дереву нужный нод с id=parentID и в него уже ложить загруженные ноды. С точки зрения производительности не лучший вариант. А можно написать вспомогательный класс:

package
{
    import mx.collections.ArrayCollection;
    import mx.controls.Tree;
    import mx.rpc.events.ResultEvent;

    public class NodeLoader
    {
        private var tree:Tree;
        private var parentNode:Object;

        /**
         * Collection of NodeLoaders
         */
        private var listeners:ArrayCollection;

        public function NodeLoader(tree:Tree, parentNode:Object, listeners:ArrayCollection)
        {
            this.listeners = listeners;
            this.parentNode = parentNode;
            this.tree = tree;
        }

        public function onSuccess(event:ResultEvent):void
        {
            var nodes:ArrayCollection = ArrayCollection(event.result);
            //todo add nodes ... whatever

            clean();
        }

        public function clean():void
        {
            tree = null;
            parentNode = null;
            listeners.removeItemAt(listeners.getItemIndex(this));
            //todo clean any other references
        }
    }
}

Для использования этого класса необходимо лишь одно дополнительное поле — loaders:ArrayCollection, это нужно для того, чтобы использовать слабые ссылки при добавлении слушателей. Добавив NodeLoader в коллекцию мы предотвратим возможную сборку мусора. Разумеется, можно было бы обойтись без дополнительного поля, используя сильные ссылки и передавая в NodeLoader RemoteObject, чтобы была возможность отписаться от события, все зависит от вас.

Пример:

var loader:NodeLoader = new NodeLoader(tree, parentNode, loaders);
loaders.addItem(loader);
remote["load"].addEventListener(ResultEvent.RESULT, loader.onSuccess, false, 0, true);

Вдохновение от flasher.ru

Еще проще:


    public class Context
    {
        private var f:Function;
        private var context:*;
        private var args:Array;

        public function Context( context:*, f:Function, ...args)
        {
            this.f = f;
            this.context = context;
            this.args = args;
        }

        public function onSomething(...rest):void
        {
            f.apply(context, rest.concat(args));
            f = null;
            context = null;
            args = null;
        }
    }

    facade.getCategories(new Context(this, onCategoriesLoaded, new FilterValueVO()).onSomething, onFault);

    private function onCategoriesLoaded(event:ResultEvent, val:FilterValueVO):void
    {
    }

, , ,

Оставить комментарий