我有一个源集合(现在是一个简单的数组)。在运行时,我使用与源相同的数组创建ArrayCollections(每个集合显示相同的源,但它们被不同地过滤)。我的问题是,当一个新项添加到源时,如果更新了这个新项的一个属性,则已经创建的arraycollections不会更新。
任何人都有解决方案吗? 如果我的来源是词典怎么办?如何在源字典中创建不同的ArrayCollections,而每当添加新项目或更新项目时集合都会更新?
感谢名单
答案 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事件的对象,则所有列表也会显示更改。