更新运行时创建的arraycollections,它们都具有相同的源

时间:2010-02-19 22:16:11

标签: flex arrays binding flex3 arraycollection

我有一个源集合(现在是一个简单的数组)。在运行时,我使用与源相同的数组创建ArrayCollections(每个集合显示相同的源,但它们被不同地过滤)。我的问题是,当一个新项添加到源时,如果更新了这个新项的一个属性,则已经创建的arraycollections不会更新。

任何人都有解决方案吗? 如果我的来源是词典怎么办?如何在源字典中创建不同的ArrayCollections,而每当添加新项目或更新项目时集合都会更新?

感谢名单

3 个答案:

答案 0 :(得分:2)

问题是Flex中的数组不是[Bindable]。所以你有几个选择:

  • 使source为ArrayCollection,并为CollectionEvent.COLLECTION_CHANGE添加addEventListener。
  • 使用某种方法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>

如果有帮助,请告诉我 兰斯

答案 1 :(得分:0)

我相信你需要使用ObjectUtil.copy()并复制你的数组。

答案 2 :(得分:0)

我的解决方案是: 我已经创建了一个从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);
   }
}

还添加了一个迭代字典的测试函数,并对项目进行计数。 如果我动态创建Lists并使用createCollection函数分配从source创建的ArrayCollection,添加,删除反射精细,所有具有相同的源项目,我想要,并在删除动态创建的列表后,一段时间后,跟踪列表计数自动减少。 / p>

如果您在源中放置了对任何更改调度propertyChange事件的对象,则所有列表也会显示更改。