Обновление во время выполнения созданных массивов коллекций, все они имеют один и тот же источник - PullRequest
0 голосов
/ 20 февраля 2010

У меня есть исходная коллекция (теперь это простой массив). Во время выполнения я создаю ArrayCollections, используя тот же массив, что и источник (каждая коллекция показывает один и тот же источник, но они по-разному фильтруются). Моя проблема в том, что когда новый элемент добавляется в источник, уже созданные коллекции массивов не обновляются, если обновляется одно из свойств этого нового элемента.

У кого-нибудь есть решение этой проблемы? Что делать, если мой источник словарь. Как создать разные ArrayCollections из исходного словаря, в то время как коллекции обновляются всякий раз, когда добавляется новый элемент или элемент обновляется?

* 1005 спасибо *

Ответы [ 3 ]

2 голосов
/ 20 февраля 2010

Проблема в том, что во Flex нет массивов [Bindable].Таким образом, у вас есть несколько вариантов:

  • Сделать source ArrayCollection и addEventListener для CollectionEvent.COLLECTION_CHANGE.
  • Добавить элементы во все коллекции массивов в некотором методе addItemToCollections, чтобы сохранитьвсе они синхронизированы.

Вот пример того, что я описываю:

<?xml version="1.0" encoding="utf-8"?>
<mx:Application
    xmlns:mx="http://www.adobe.com/2006/mxml"
    xmlns:local="*"
    creationComplete="creationCompleteHandler()">

    <mx:Script>
        <![CDATA[
            import mx.events.CollectionEvent;
            import mx.events.CollectionEventKind;
            import mx.collections.ArrayCollection;
            import ColorPalette;

            protected function creationCompleteHandler():void
            {
                var item:Object;
                var i:int = 0;
                var n:int = source.length;
                for (i; i < n; i++)
                {
                    item = source[i];
                    collectionA.addItem(item);
                    collectionB.addItem(item);
                    collectionC.addItem(item);
                    bindableCollection.addItem(item);
                }
                bindableCollection.addEventListener(CollectionEvent.COLLECTION_CHANGE, collectionChangeHandler);
            }

            protected function collectionChangeHandler(event:CollectionEvent):void
            {
                switch (event.kind)
                {
                    case CollectionEventKind.ADD :
                        collectionA.addItem(event.items[0]);
                        collectionB.addItem(event.items[0]);
                        collectionC.addItem(event.items[0]);
                    break;
                }
            }

            public function addItem():void
            {
                source.push({name:"new item " + (Math.random()*1000).toString()});
            }

            public function addItemToCollection():void
            {
                var item:Object = {name:"new item " + (Math.round(Math.random()*1000)).toString()};
                collectionA.addItem(item);
                collectionB.addItem(item);
                collectionC.addItem(item);
            }

            public function addToBindableCollection():void
            {
                var item:Object = {name:"new item " + (Math.round(Math.random()*1000)).toString()};
                bindableCollection.addItem(item);
            }

        ]]>
    </mx:Script>

    <mx:Array id="source">
        <mx:Object name="one"/>
        <mx:Object name="two"/>
        <mx:Object name="three"/>
    </mx:Array>

    <mx:ArrayCollection id="collectionA"/>
    <mx:ArrayCollection id="collectionB"/>
    <mx:ArrayCollection id="collectionC"/>
    <mx:ArrayCollection id="bindableCollection"/>

    <!-- sample lists -->
    <mx:Panel id="panel" width="100%" height="100%">
        <mx:Button label="Add Item to Source" click="addItem()"/>
        <mx:Button label="Add Item to Collections" click="addItemToCollection()"/>
        <mx:Button label="Add Item to Bindable Collection" click="addToBindableCollection()"/>
        <mx:HBox width="100%" height="100%">
            <mx:List id="listA" dataProvider="{collectionA}" labelField="name"/>
            <mx:List id="listB" dataProvider="{collectionB}" labelField="name"/>
            <mx:List id="listC" dataProvider="{collectionC}" labelField="name"/>
        </mx:HBox>
    </mx:Panel>

</mx:Application>

Дайте мне знать, если это поможет, Ланс

0 голосов
/ 20 февраля 2010

Мое решение: Я создал новый класс, производный от ArrayCollection. Назовите это SourceCollection. Добавлен новый закрытый член - словарь, созданный с weakKeys, установленным в true . Новая открытая функция создает новую коллекцию ArrayCollection из своих элементов и добавляет ссылку на эту созданную коллекцию в частный словарь, например:

public function createCollection():ArrayCollection
{
   var result:ArrayCollection = new ArrayCollection();
       result.addAll(this);
   createdCollections[result] = null;
   return result;
}

Переопределяет функции addItemAt, removeItemAt и removeAll: каждый вызывает свою суперфункцию, выполняет итерацию по словарю и выполняет соответствующую функцию. Обратите внимание, что addItem и addAll также вызывают addItemAt, поэтому их не нужно переопределять. Один пример:

override public function addItemAt(item:Object, index:int):void
{
   super.addItemAt(item, index);

   for (var coll:Object in createdCollections)
   {
     (coll as ArrayCollection).addItemAt(item, index);
   }
}

Также добавлена ​​тестовая функция, которая перебирает словарь и подсчитывает элементы. Если я динамически создаю списки и назначаю ArrayCollection, созданную из источника, с помощью функции createCollection, добавляя, удаляя отраженный штраф, все имеет те же исходные элементы, которые мне нужны, и после удаления динамически создаваемых списков через некоторое время количество отслеживаемых списков автоматически уменьшается.

Если вы помещаете объекты в источник, который отправляет событие propertyChange, при любом изменении, все списки также показывают это изменение.

0 голосов
/ 20 февраля 2010

Полагаю, вам нужно использовать ObjectUtil.copy () и делать копии вашего массива.

...